Roll20 uses cookies to improve your experience on our site. Cookies enable you to enjoy certain features, social sharing functionality, and tailor message and display ads to your interests on our site and others. They also help us understand how our site is being used. By continuing to use our site, you consent to our use of cookies. Update your cookie preferences .
×

Sheets don't seem to be firing add:character or change:attribute events.

To clarify, they were working this morning.  I have an extensive back-end API on my custom character sheet that reads data out of handouts.  Unfortunately, when I create a new character in the game, none of my log statements are firing. The following code is in my ready event handler.  The log statements before the blocks of code (that let me know my handouts have been loaded properly) run fine. Any ideas? on('add:character', function (character) {         General.GetOrCreateAttr(character.id, 'Ability_Intelligence_Score', 10, 50);         General.GetOrCreateAttr(character.id, 'Ability_Wisdom_Score', 10, 50);         General.GetOrCreateAttr(character.id, 'Ability_Charisma_Score', 10, 50);         General.GetOrCreateAttr(character.id, 'Ability_Strength_Score', 10, 50);         General.GetOrCreateAttr(character.id, 'Ability_Dexterity_Score', 10, 50);         General.GetOrCreateAttr(character.id, 'Ability_Constitution_Score', 10, 50);         General.GetOrCreateAttr(character.id, 'Ability_Comeliness_Score', 10, 50);         General.GetOrCreateAttr(character.id, 'Ability_Speed_Score', 10, 200);     });     on('change:attribute', function (attribute, oldAttribute) {         var characterId = attribute.get('characterid');         var attr = attribute.get('name');         log(General.GetCharacterName(characterId) + ' - ' + attr);         var nameArray = [];         if (attr.indexOf('_') != -1) { nameArray = attr.split('_'); } else { nameArray.push(attr); }         while (nameArray.length < 3) { nameArray.push(''); }         if ((nameArray[0] == 'Weapons' || nameArray[0] == 'Shields') && (nameArray[1] == parseInt(nameArray[1], 10) || nameArray[2] == 'Equipped')) {             log('Calculating Weapons & Defenses for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');             characterSheet.Refresh.Weapons(characterId);             characterSheet.Refresh.Defenses(characterId);         } else if (nameArray[0] == 'Armor' && ((nameArray[2] == parseInt(nameArray[2], 10)) || (nameArray[2] == "Equipped" && nameArray.length < 4))) {             log('Calculating Armor & Defenses for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');             characterSheet.Refresh.Armor(characterId, nameArray[1]);             characterSheet.Refresh.Defenses(characterId);         } else if (nameArray[0] == 'Race') {             log('Calculating Ability Scores, Power Sources, HP, Defenses, Weapons, Saves, & Regeneration for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');             characterSheet.Refresh.Intelligence(characterId);             characterSheet.Refresh.Wisdom(characterId);             characterSheet.Refresh.Charisma(characterId);             characterSheet.Refresh.Strength(characterId);             characterSheet.Refresh.Dexterity(characterId);             characterSheet.Refresh.Constitution(characterId);             characterSheet.Refresh.Comeliness(characterId);             characterSheet.Refresh.Speed(characterId);             characterSheet.Refresh.PowerSources(characterId);             characterSheet.Refresh.HitPoints(characterId);             characterSheet.Refresh.Weapons(characterId);             characterSheet.Refresh.Defenses(characterId);             characterSheet.Refresh.SavingThrowBonuses(characterId);             characterSheet.Refresh.Regeneration(characterId);         } else if (nameArray[0] == 'Ability' && nameArray[2] == 'Score') {             if (nameArray[1] == 'Intelligence') {                 log('Calculating Intelligence, Power Sources, & Defenses for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');                 characterSheet.Refresh.Intelligence(characterId);                 characterSheet.Refresh.PowerSources(characterId);                 characterSheet.Refresh.Defenses(characterId);             } else if (nameArray[1] == 'Wisdom') {                 log('Calculating Wisdom, Power Sources, Saving Throws, and Defenses for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');                 characterSheet.Refresh.Wisdom(characterId);                 characterSheet.Refresh.PowerSources(characterId);                 characterSheet.Refresh.SavingThrowBonuses(characterId);                 characterSheet.Refresh.Defenses(characterId);             } else if (nameArray[1] == 'Charisma') {                 log('Calculating Charisma for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');                 characterSheet.Refresh.Charisma(characterId);             } else if (nameArray[1] == 'Strength') {                 log('Calculating Strength & Weapons for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');                 characterSheet.Refresh.Strength(characterId);                 characterSheet.Refresh.Weapons(characterId);             } else if (nameArray[1] == 'Dexterity') {                 log('Calculating Dexterity, Weapons, Defenses, and Saving Throws for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');                 characterSheet.Refresh.Dexterity(characterId);                 characterSheet.Refresh.Weapons(characterId);                 characterSheet.Refresh.Defenses(characterId);                 characterSheet.Refresh.SavingThrowBonuses(characterId);             } else if (nameArray[1] == 'Constitution') {                 log('Calculating Constitution, Power Sources, Regeneration, Hit Points, Defenses, and Saving Throws for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');                 characterSheet.Refresh.Constitution(characterId);                 characterSheet.Refresh.PowerSources(characterId);                 characterSheet.Refresh.Regeneration(characterId);                 characterSheet.Refresh.HitPoints(characterId);                 characterSheet.Refresh.Defenses(characterId);                 characterSheet.Refresh.SavingThrowBonuses(characterId);             } else if (nameArray[1] == 'Comeliness') {                 log('Calculating Comeliness for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');                 characterSheet.Refresh.Comeliness(characterId);             } else if (nameArray[1] == 'Speed') {                 log('Calculating Speed & Defenses for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');                 characterSheet.Refresh.Speed(characterId);                 characterSheet.Refresh.Defenses(characterId);             }         } else if (nameArray[0] == 'MartialArts' && (nameArray[2] == 'Equipped' || nameArray[2] == 'Level')) {             log('Calculating Martial Arts, Weapons, Defenses, and Saving Throws for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');             characterSheet.Refresh.MartialArts(characterId, nameArray[1]);             characterSheet.Refresh.Weapons(characterId);             characterSheet.Refresh.Defenses(characterId);             characterSheet.Refresh.SavingThrowBonuses(characterId);         } else if (nameArray[0] == 'WeaponSkill' && nameArray[2] == 'Level') {             log('Calculating Weapon Skills, Weapons, and Defenses for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');             characterSheet.Refresh.WeaponSkills(characterId, nameArray[1]);             characterSheet.Refresh.Weapons(characterId);             characterSheet.Refresh.Defenses(characterId);         } else if (nameArray[0] == 'Class' && nameArray[2] == 'Level') {             log('Calculating Experience, Saving Throw Targets, Hit Points, and Power Sources for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');             characterSheet.Refresh.Experience(characterId);             characterSheet.Refresh.SavingThrowTargets(characterId);             characterSheet.Refresh.HitPoints(characterId);             characterSheet.Refresh.PowerSources(characterId);         } else if (nameArray[0] == 'Class' && nameArray[2] == 'Active') {             log('Calculating Experience for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');             characterSheet.Refresh.Experience(characterId);         } else if (nameArray[0] == 'Regeneration' && nameArray[2] == 'Bonus') {             log('Calculating Regeneration for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');             characterSheet.Refresh.Regeneration(characterId);         } else if (nameArray[0] == 'Encumberance' || nameArray[0] == 'WeightClass') {             log('Calculating Weapons & Defenses for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');             characterSheet.Refresh.Weapons(characterId);             characterSheet.Refresh.Defenses(characterId);         } else if (nameArray[0] == 'Protection') {             characterSheet.Refresh.SavingThrowBonuses(characterId);             characterSheet.Refresh.Defenses(characterId);         } else if (nameArray[0] == 'Achievement') {             //log('Calculating Achievements for ' + General.GetCharacterName(characterId) + ' - ' + attr + ' changed.');             //characterSheet.Refresh.Achievements(characterId, nameArray[1]);         } else if (nameArray[0] == 'NPC') {             if (nameArray[1] == 'HD') {                 characterSheet.Refresh.HitPoints(characterId);             } else if (nameArray[1] == 'Saves') {                 characterSheet.Refresh.SavingThrowTargets(characterId);             }         } else if (nameArray[0] == 'Skill' && nameArray[nameArray.length - 1] == 'Level') {             characterSheet.FlagSkill(characterId, nameArray);         }     });
After further testing, it is firing the add:character event handler, but not the change:attribute handler.