EDIT: looks like there is something going on with the createObj("graphic",...) call, as soon as I call it the values on one of the original character's attribute linked to a bar (npc_ac) is cleared out _.each(findObjs({type:'attribute', characterid: targetCharId}), (attr) => { if(attr.get("name") == "npc_ac") { log("found ac = " + JSON.stringify(attr)); } });
// create a copy of the character token let tokenLinks = [null, null, null]; let newCharacterToken = newCharacterTokenData ? createObj("graphic", newCharacterTokenData) : null;
_.each(findObjs({type:'attribute', characterid: targetCharId}), (attr) => { if(attr.get("name") == "npc_ac") { log("found ac again = " + JSON.stringify(attr)); } }); outputs: "found ac = {\"name\":\"npc_ac\",\"current\":\"11\",\"max\":\"\",\"_id\":\"-MCQdfD2mNThEAdkbqc5\",\"_type\":\"attribute\",\"_characterid\":\"-MCQdevSr10_7N3vSvE6\"}"
"found ac again = {\"name\":\"npc_ac\",\"current\":\"\",\"max\":\"\",\"_id\":\"-MCQdfD2mNThEAdkbqc5\",\"_type\":\"attribute\",\"_characterid\":\"-MCQdevSr10_7N3vSvE6\"}" ORIGINAL POST: I have a snipped of code with getObj that is returning some weird data. In the test code i am searching for the npc_ac attribute with a findObj and i log it, i can see that the current value is 12. then i try to find it with a getObj, and when i log it i can see that the current is now empty for some reason. this is my output "start search"
"target token = {\"width\":70,\"height\":70,\"bar1_value\":\"19\",\"bar1_max\":\"19\",\"bar2_link\":\"-MCQbXRAUJ-5YHhRb-wZ\",\"represents\":\"-MCQbX-y_U8D5UJnKBm5\",\"name\":\"Ape\",\"imgsrc\":\"<a href="https://s3.amazonaws.com/files.d20.io/images/28449849/MXql7HghIay1nFPZU_PJSg/thumb.png\" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/28449849/MXql7HghIay1nFPZU_PJSg/thumb.png\</a>"}"
"new token = {\"width\":70,\"height\":70,\"bar1_value\":\"19\",\"bar1_max\":\"19\",\"bar2_link\":\"-MCQbXRAUJ-5YHhRb-wZ\",\"represents\":\"-MCQbX-y_U8D5UJnKBm5\",\"name\":\"Ape\",\"imgsrc\":\"<a href="https://s3.amazonaws.com/files.d20.io/images/28449849/MXql7HghIay1nFPZU_PJSg/thumb.png?9043476\",\"_pageid\":\"-JvyFmkcZSMhT1TAQGx_\",\"layer\":\"gmlayer\",\"left\":-500,\"top\":-500" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/28449849/MXql7HghIay1nFPZU_PJSg/thumb.png?9043476\",\"_pageid\":\"-JvyFmkcZSMhT1TAQGx_\",\"layer\":\"gmlayer\",\"left\":-500,\"top\":-500</a>}"
"targetCharacter = {\"name\":\"Ape\",\"bio\":1594969956477,\"gmnotes\":\"\",\"_defaulttoken\":1594969960551,\"archived\":false,\"inplayerjournals\":\"\",\"controlledby\":\"\",\"_id\":\"-MCQbX-y_U8D5UJnKBm5\",\"_type\":\"character\",\"avatar\":\"<a href="https://s3.amazonaws.com/files.d20.io/images/28449849/MXql7HghIay1nFPZU_PJSg/original.png\" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/28449849/MXql7HghIay1nFPZU_PJSg/original.png\</a>"}"
"newCharacterData = {\"name\":\"Lavinia - Ape\",\"bio\":1594969956477,\"gmnotes\":\"\",\"archived\":false,\"inplayerjournals\":\"\",\"controlledby\":\"\",\"_type\":\"character\",\"avatar\":\"<a href="https://s3.amazonaws.com/files.d20.io/images/28449849/MXql7HghIay1nFPZU_PJSg/thumb.png?9471735\" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/28449849/MXql7HghIay1nFPZU_PJSg/thumb.png?9471735\</a>"}"
"newCharacter = {\"name\":\"Lavinia - Ape\",\"bio\":1594969956477,\"gmnotes\":\"\",\"_defaulttoken\":\"\",\"archived\":false,\"inplayerjournals\":\"\",\"controlledby\":\"\",\"_id\":\"-MCQb_BOW5Qz88PNw7of\",\"_type\":\"character\",\"avatar\":\"<a href="https://s3.amazonaws.com/files.d20.io/images/28449849/MXql7HghIay1nFPZU_PJSg/thumb.png?9471735\" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/28449849/MXql7HghIay1nFPZU_PJSg/thumb.png?9471735\</a>"}"
"found ac = {\"name\":\"npc_ac\",\"current\":\"12\",\"max\":\"\",\"_id\":\"-MCQbXRAUJ-5YHhRb-wZ\",\"_type\":\"attribute\",\"_characterid\":\"-MCQbX-y_U8D5UJnKBm5\"}"
"get linkData bar1_link"
"linkData = "
"get linkData bar2_link"
"linkData = -MCQbXRAUJ-5YHhRb-wZ"
"found link attr = {\"name\":\"npc_ac\",\"current\":\"\",\"max\":\"\",\"_id\":\"-MCQbXRAUJ-5YHhRb-wZ\",\"_type\":\"attribute\",\"_characterid\":\"-MCQbX-y_U8D5UJnKBm5\"}"
"saved link data = {\"data\":\"-MCQbXRAUJ-5YHhRb-wZ\",\"name\":\"npc_ac\",\"val\":\"\",\"max\":\"\"}"
"get linkData bar3_link"
"linkData = " and this is the snippet async duplicateCharacter(targetCharacter, newCharacterName) {
if (!targetCharacter)
{
this.chatError("WildUtils::duplicateCharacter: trying to duplicate an invalid character");
return null;
}
let targetCharacterName = targetCharacter.get("name");
let targetCharId = targetCharacter.get("_id");
let errorMsgHeader = "WildUtils::duplicateCharacter (" + targetCharacterName + " -> " + newCharacterName + "): ";
const jsonObj = (o) => JSON.parse(JSON.stringify(o));
// find character token
let targetCharacterToken = null;
let newCharacterTokenData = null;
await this.getDefaultToken(targetCharacter).then( (token) => { targetCharacterToken = token; });
if (targetCharacterToken)
{
// make a copy of the data and create a new off screen temporary graphic token
newCharacterTokenData = jsonObj(targetCharacterToken);
newCharacterTokenData.imgsrc = this.getCleanImgsrc(newCharacterTokenData.imgsrc);
if(newCharacterTokenData.imgsrc == "")
{
newCharacterTokenData.imgsrc = this.getCleanImgsrc(targetCharacter.get("avatar"));
if(newCharacterTokenData.imgsrc == "")
{
this.chatError(errorMsgHeader + "cannot find image on either token or avatar; if it's using a marketplace link the image needs to be re-uploaded into the library and set on the target character as either token or avatar image");
newCharacterTokenData = null;
return null;
}
}
// graphic token data setup
newCharacterTokenData._pageid = Campaign().get("playerpageid");
newCharacterTokenData.layer = "gmlayer";
newCharacterTokenData.left = -500;
newCharacterTokenData.top = -500;
}
// test
log("start search");
log("target token = " + JSON.stringify(targetCharacterToken));
log("new token = " + JSON.stringify(newCharacterTokenData));
// create new character
log("targetCharacter = " + JSON.stringify(targetCharacter));
let newCharacterData = jsonObj(targetCharacter);
delete newCharacterData._defaulttoken;
delete newCharacterData._id;
newCharacterData.name = newCharacterName;
newCharacterData.avatar = this.getCleanImgsrc(targetCharacter.get("avatar"));
log("newCharacterData = " + JSON.stringify(newCharacterData));
let newCharacter = createObj('character', newCharacterData);
let newCharacterId = newCharacter.get("_id");
log("newCharacter = " + JSON.stringify(newCharacter));
_.each(findObjs({type:'attribute', characterid: targetCharId}), (attr) => {
if(attr.get("name") == "npc_ac")
{
log("found ac = " + JSON.stringify(attr));
}
});
// create a copy of the character token
let tokenLinks = [null, null, null];
let newCharacterToken = newCharacterTokenData ? createObj("graphic", newCharacterTokenData) : null;
if (newCharacterToken)
{
newCharacterToken.set("represents", newCharacterId);
// cache link info
for (let i = 0; i < 3; ++i)
{
log("get linkData " + "bar" + (i + 1).toString() + "_link");
let linkData = newCharacterToken.get("bar" + (i + 1).toString() + "_link");
log("linkData = " + linkData);
if (linkData && linkData !== "")
{
//let linkAttrs = findObjs({type:'attribute', _id: linkData, _characterid: targetCharId});
//_.each(linkAttrs, (linkAttr) => {
let linkAttr = getObj("attribute", linkData);
if (linkAttr)
{
let tmpTokenData = {};
tmpTokenData.data = linkData;
tmpTokenData.name = linkAttr.get("name");
let val = newCharacterToken.get("bar" + (i + 1).toString() + "_value");
tmpTokenData.val = !_.isUndefined(val) ? val : null;
val = newCharacterToken.get("bar" + (i + 1).toString() + "_max");
tmpTokenData.max = !_.isUndefined(val) ? val : null;
tokenLinks[i] = tmpTokenData;
log("found link attr = " + JSON.stringify(linkAttr));
log("saved link data = " + JSON.stringify(tmpTokenData));
}
//});
}
}
newCharacterToken.remove();
newCharacter.remove();
return null;
}