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 .
×

Updating values with worker - ReferenceError: modifier_trainer_dex is not defined

Hello, I'm using an old legacy theme for my custom character sheet. I'm working to calculate the skill values for a player based on the modifier values based on the players modifiers for dex, int, wis, etc. I tried using the auto-calc but it didn't seem to work for the legacy page so I switched to using a text/worker to get the values updated on change.  I however am getting this error message below. I thought that the getAttrs( would be all thats needed to prevent this error but I must be missing something. ReferenceError: modifier_trainer_dex is not defined     at Object.eval [as -Mh9FQwxT-OEQP9z8myt//false//0.5744272464928988] (eval at messageHandler (sheetsandboxworker.js?1629230835928:752), <anonymous>:7:31)     at _fullfillAttrReq (sheetsandboxworker.js?1629230835928:727)     at messageHandler (sheetsandboxworker.js?1629230835928:762) My Script/ Worker is below: <script type="text/worker"> const stats = ["modifier_trainer_str", "modifier_trainer_dex", "modifier_trainer_con", "modifier_trainer_int", "modifier_trainer_wis", "modifier_trainer_cha"]; stats.forEach(stat => { on(`change:${stat}`, () => { getAttrs([stat], values => {             setAttrs({         trainer_initiative: modifier_trainer_dex,         trainer_sav_str: modifier_trainer_str,         trainer_sav_dex: modifier_trainer_dex,         trainer_sav_con: modifier_trainer_con,         trainer_sav_int: modifier_trainer_int,         trainer_sav_wis: modifier_trainer_wis,         trainer_sav_cha: modifier_trainer_cha,         trainer_skill_acrobatics: modifier_trainer_dex,         trainer_skill_animalhandling: modifier_trainer_wis, trainer_skill_arcana: modifier_trainer_int, trainer_skill_athletics: modifier_trainer_str, trainer_skill_deception: modifier_trainer_cha, trainer_skill_history: modifier_trainer_int, trainer_skill_insight: modifier_trainer_wis, trainer_skill_intimidation: modifier_trainer_cha, trainer_skill_investigation: modifier_trainer_int, trainer_skill_medicine: modifier_trainer_wis, trainer_skill_nature: modifier_trainer_int, trainer_skill_perception: modifier_trainer_wis, trainer_skill_performance: modifier_trainer_cha, trainer_skill_persuasion: modifier_trainer_cha, trainer_skill_religion: modifier_trainer_int, trainer_skill_sleightofhand: modifier_trainer_dex, trainer_skill_stealth: modifier_trainer_dex, trainer_skill_survival: modifier_trainer_wis         });     });     }); }); </script> Any help is much appreciated.
1629235781
Scott C.
Forum Champion
Sheet Author
API Scripter
Compendium Curator
The values from getAttrs are stored in the object that you use as the variable in the callback of getAttrs ( values in your case). You need to access the value of that key of the object. So: <script type="text/worker"> const stats = ["modifier_trainer_str", "modifier_trainer_dex", "modifier_trainer_con", "modifier_trainer_int", "modifier_trainer_wis", "modifier_trainer_cha"]; stats.forEach(stat => { on(`change:${stat}`, () => { getAttrs([stat], values => {             setAttrs({         trainer_initiative: values.modifier_trainer_dex ,                     });         });     });     }); }); </script> However, you'll also need to make your object for setAttrs more specific as otherwise it'll be setting all the values for the other attributes to undefined.
1629239836
GiGs
Pro
Sheet Author
API Scripter
When you use forEach like this, you are creating completely independent sheet workers, one for each stat in your stats array. When any of those stats change, everything in your setAttrs will run. So you'll have a sheet worker like this: on(`change:modifier_trainer_str`, () => { getAttrs(['modifier_trainer_str'], values => {             setAttrs({         trainer_initiative: modifier_trainer_dex,         trainer_sav_str: modifier_trainer_str,         trainer_sav_dex: modifier_trainer_dex,         trainer_sav_con: modifier_trainer_con,         trainer_sav_int: modifier_trainer_int,         trainer_sav_wis: modifier_trainer_wis,         trainer_sav_cha: modifier_trainer_cha,         trainer_skill_acrobatics: modifier_trainer_dex,         trainer_skill_animalhandling: modifier_trainer_wis, trainer_skill_arcana: modifier_trainer_int, trainer_skill_athletics: modifier_trainer_str, trainer_skill_deception: modifier_trainer_cha, trainer_skill_history: modifier_trainer_int, trainer_skill_insight: modifier_trainer_wis, trainer_skill_intimidation: modifier_trainer_cha, trainer_skill_investigation: modifier_trainer_int, trainer_skill_medicine: modifier_trainer_wis, trainer_skill_nature: modifier_trainer_int, trainer_skill_perception: modifier_trainer_wis, trainer_skill_performance: modifier_trainer_cha, trainer_skill_persuasion: modifier_trainer_cha, trainer_skill_religion: modifier_trainer_int, trainer_skill_sleightofhand: modifier_trainer_dex, trainer_skill_stealth: modifier_trainer_dex, trainer_skill_survival: modifier_trainer_wis         });     });     }); then another like this: on(`change:modifier_trainer_dex`, () => { getAttrs(['modifier_trainer_dex'], values => {             setAttrs({         trainer_initiative: modifier_trainer_dex,         trainer_sav_str: modifier_trainer_str,         trainer_sav_dex: modifier_trainer_dex,         trainer_sav_con: modifier_trainer_con,         trainer_sav_int: modifier_trainer_int,         trainer_sav_wis: modifier_trainer_wis,         trainer_sav_cha: modifier_trainer_cha,         trainer_skill_acrobatics: modifier_trainer_dex,         trainer_skill_animalhandling: modifier_trainer_wis, trainer_skill_arcana: modifier_trainer_int, trainer_skill_athletics: modifier_trainer_str, trainer_skill_deception: modifier_trainer_cha, trainer_skill_history: modifier_trainer_int, trainer_skill_insight: modifier_trainer_wis, trainer_skill_intimidation: modifier_trainer_cha, trainer_skill_investigation: modifier_trainer_int, trainer_skill_medicine: modifier_trainer_wis, trainer_skill_nature: modifier_trainer_int, trainer_skill_perception: modifier_trainer_wis, trainer_skill_performance: modifier_trainer_cha, trainer_skill_persuasion: modifier_trainer_cha, trainer_skill_religion: modifier_trainer_int, trainer_skill_sleightofhand: modifier_trainer_dex, trainer_skill_stealth: modifier_trainer_dex, trainer_skill_survival: modifier_trainer_wis         });     });     }); and so on for every stat in your array. (with the values. part added, I didn't want to manually add them all). As Scott says, you'll get a lot of undefined entries, because each worker doesn't have all the stats in the setAttrs. So you need to do one of two things: Use a single sheet worker, which includes a change: for every stat in your array. That way your setAttrs will work fine. Have a separate sheet worker for each of the core stats (modifier_trainer_str, modifier_trainer_dex, etc) and where the setAttrs includes only the values that are linked to that stat. It's possible to set this up programmatically. Converting it to a single sheet worker is easiest (requires least work to modify existing code, and it's my bed time so that's the one I'm doing), and that would look like: const   stats  = [ "modifier_trainer_str" ,  "modifier_trainer_dex" ,  "modifier_trainer_con" ,  "modifier_trainer_int" ,  "modifier_trainer_wis" ,  "modifier_trainer_cha" ]; const   stats_changes  =  stats . map ( stat   =>   `change: ${ stat } ` ). join ( ' ' ); // build a string with all the change: entries, because I am too sleepy to type them. on ( stats_changes , ()  =>  {      getAttrs ( stats ,  values   =>  {          setAttrs ({              trainer_initiative :   values . modifier_trainer_dex ,              trainer_sav_str :   values . modifier_trainer_str ,              trainer_sav_dex :   values . modifier_trainer_dex ,              trainer_sav_con :   values . modifier_trainer_con ,              trainer_sav_int :   values . modifier_trainer_int ,              trainer_sav_wis :   values . modifier_trainer_wis ,              trainer_sav_cha :   values . modifier_trainer_cha ,              trainer_skill_acrobatics :   values . modifier_trainer_dex ,              trainer_skill_animalhandling :   values . modifier_trainer_wis ,              trainer_skill_arcana :   values . modifier_trainer_int ,              trainer_skill_athletics :   values . modifier_trainer_str ,              trainer_skill_deception :   values . modifier_trainer_cha ,              trainer_skill_history :   values . modifier_trainer_int ,              trainer_skill_insight :   values . modifier_trainer_wis ,              trainer_skill_intimidation :   values . modifier_trainer_cha ,              trainer_skill_investigation :   values . modifier_trainer_int ,              trainer_skill_medicine :   values . modifier_trainer_wis ,              trainer_skill_nature :   values . modifier_trainer_int ,              trainer_skill_perception :   values . modifier_trainer_wis ,              trainer_skill_performance :   values . modifier_trainer_cha ,              trainer_skill_persuasion :   values . modifier_trainer_cha ,              trainer_skill_religion :   values . modifier_trainer_int ,              trainer_skill_sleightofhand :   values . modifier_trainer_dex ,              trainer_skill_stealth :   values . modifier_trainer_dex ,              trainer_skill_survival :   values . modifier_trainer_wis         });     }); }); This does raise the question: are those skills modified by anything else, like level, proficiency, etc. If so this above method is incomplete and you'll need further work to account for such things. maybe these are sent to an attribute bonus input for that skill.
Thank you both very much, I feel great about my html/ css skills but I'm still learning js. Both of these explanations helped a lot in a number of ways so thanks. I will have one other attribute for if the user is proficient in that skill or not which is currently saved as an attr_ in the form of a checkbox. I will work off these examples and try adding that in myself. If I get stuck for longer than is healthy I will gladly create a new post about it.