nexgui4 1.2.3 → 1.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/nexGui4.nxs CHANGED
@@ -1 +1,817 @@
1
- {"type":"group","name":"nexGui4","enabled":true,"items":[{"type":"function","name":"__meta","enabled":true,"code":"{\n\t\"description\": \"nexGui4 Achaea enhancements for the Nexus client\",\n \"version\": \"1.2.3\",\n \"website\": \"https://github.com/NexusUnleashed/nexgui4\",\n \"dependencies\": [\n \"eventStream4\",\n \"nexSys4\"\n ]\n}"},{"type":"function","name":"SCRATCH","enabled":true,"code":"/* Khaseem's scratch pad */\n/*\n\n*/\n"},{"type":"function","name":"README","enabled":true,"code":"/***************************************************************************************************\nAdd instructions here\n****************************************************************************************************/"},{"type":"function","name":"onInstall","enabled":true,"code":"nexusclient.reflexes().run_function('onLoad', {}, 'nexGui4');\nconst np = nexusclient.packages();\nif (!np.exists('eventStream4')) {\n fetch(`https://unpkg.com/nexevent/eventStream4.nxs`, { cache: \"no-store\" })\n .then((r) => r.json())\n .then((d) => {\n const p = np.create('eventStream4', 'placeholder');\n p.name = \"eventStream4\";\n const i = np.exists('eventStream4');\n np.move(i - 1, 1);\n np\n .get(\"eventStream4\")\n .apply(d, nexusclient.reflexes());\n setTimeout(()=>{\n nexusclient.reflexes().run_function('onLoad', {}, 'eventStream4');\n },0)\n });\n}"},{"type":"function","name":"onLoad","enabled":true,"code":"globalThis.React ??= nexusclient.platform().React;\nglobalThis.ReactDOM ??= nexusclient.platform().ReactDOM;\n\nglobalThis.GMCP ??= nexusclient.datahandler().GMCP;\n\nnexusclient.packages().get('nexGui4').items.filter(item => item.type === 'group').forEach(group => group.enabled = false);"},{"type":"function","name":"SystemLoaded","enabled":true,"code":"//return;\nimport('https://unpkg.com/nexgui4/dist/nexgui4.min.js').then(() => {\n nexusclient.packages().get('nexGui4').items.filter(item => item.type === 'group').forEach(group => group.enabled = true);\n nexGui.bootstrapNexus();\n});"},{"type":"group","name":"nexGui.colors","enabled":true,"actions":[],"items":[{"type":"group","name":"balances","enabled":true,"items":[{"type":"trigger","name":"Bal Recover","enabled":true,"actions":[{"type":"script","enabled":true,"script":"const seconds = nexSys?.state?.balances?.balance?.lastServerDurationSeconds;\nconst label = Number(seconds) > 0 ? `(${Number(seconds).toFixed(2)})` : \"\";\n\nconst rule = (color) =>\n `<span style=\"flex:1;min-width:0;align-self:center;height:0;border-top:3px double ${color};\"></span>`;\n\n// inline-flex keeps it on the timestamp's line; the constant 15ch reservation\n// matches the skill replacement rows so balance + skill lines align.\nconst html =\n `<span style=\"display:inline-flex;align-items:center;width:calc(100% - 15ch);gap:.75ch;overflow:hidden;vertical-align:middle;\">` +\n rule(\"#33cc33\") +\n `<span style=\"flex:0 0 auto;white-space:nowrap;\">` +\n `<span style=\"color:#33cc33;\">BALANCE&nbsp;&nbsp;&nbsp;&nbsp;</span>` +\n (label ? ` <span style=\"color:#00ccff;\">${label}</span>` : ``) +\n `</span>` +\n rule(\"#00ccff\") +\n `</span>`;\n\nnexSys.api.line.replaceHTML(html);\n"}],"text":"You have recovered balance on all limbs.","matching":"exact","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"Eq Recover","enabled":true,"actions":[{"type":"script","enabled":true,"script":"const seconds = nexSys?.state?.balances?.balance?.lastServerDurationSeconds;\nconst label = Number(seconds) > 0 ? `(${Number(seconds).toFixed(2)})` : \"\";\n\nconst rule = (color) =>\n `<span style=\"flex:1;min-width:0;align-self:center;height:0;border-top:3px double ${color};\"></span>`;\n\n// inline-flex keeps it on the timestamp's line; the constant 15ch reservation\n// matches the skill replacement rows so balance + skill lines align.\nconst html =\n `<span style=\"display:inline-flex;align-items:center;width:calc(100% - 15ch);gap:.75ch;overflow:hidden;vertical-align:middle;\">` +\n rule(\"#00ccff\") +\n `<span style=\"flex:0 0 auto;white-space:nowrap;\">` +\n `<span style=\"color:#00ccff;\">EQUILIBRIUM</span>` +\n (label ? ` <span style=\"color:#33cc33;\">${label}</span>` : ``) +\n `</span>` +\n rule(\"#33cc33\") +\n `</span>`;\n\nnexSys.api.line.replaceHTML(html);\n"}],"text":"You have recovered equilibrium.","matching":"exact","whole_words":true,"case_sensitive":true}]},{"type":"function","name":"nexGui.colors","enabled":true,"code":"// https://www.w3schools.com/colors/colors_names.asp\nnexGui.api.room.items.set('a monolith sigil', { text: 'A MONOLITH SIGIL', color: 'red' });\nnexGui.api.room.items.set('a granite boulder', { text: 'BOULDER!!!', color: 'tomato' });\n"},{"type":"trigger","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"//nexSys.replaceHTML(`<span>The ${nexGui.iconHTML('fish-fins', ['khaki', 'orange'], 16)} appear to be plentiful here.`);\n//console.log(args[0]);\n//console.log('You bleed line -1:', nexusclient.current_block[nexusclient.current_line.index -1].line)\n\nif (nexusclient.current_line.index > 0) {\n nexusclient.current_block[nexusclient.current_line.index -1].gag = true;\n}\nnexSys.api.line.replaceHTML(args[0].replaceAll('bleed', nexGui.api.colors.iconHtml('droplet', ['red', 'silver'], 16)))\n"}],"text":"^You bleed \\d+ health\\.$","matching":"regexp","whole_words":true,"case_sensitive":true}]},{"type":"group","name":"nexGui.party","enabled":true,"actions":[],"items":[{"type":"trigger","name":"Party Aff call 1","enabled":true,"actions":[{"type":"script","enabled":true,"script":"//(Party): Dalran says, \"Paralysis on Dunn.\"\nif (!nexGui.state.party.settings.affCalls || !nexGui.api.party.isMember(args[1])) {\n return;\n}\n\n//GMCP safeguard\nif (GMCP.Comm.Channel.Text.talker !== args[1]) {\n return;\n}\n\n// This triggers an event in my personal affliction tracking system. Left in place as\n// an example of how it might be used.\nif (GMCP.Target === args[3]) {\n /*eventStream.raiseEvent(`${args[2]}GotInsightAff`);*/\n}"}],"text":"^\\(Party\\): (\\w+) says, \"(\\w+) on (\\w+)\\.\"$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"Party Aff call 2","enabled":true,"actions":[{"type":"script","enabled":true,"script":"//(Party): Fieth says, \"Vanessa: Asthma.\"\nif (!nexGui.state.party.settings.affCalls || !nexGui.api.party.isMember(args[1])) {\n return;\n}\n\n//GMCP safeguard\nif (GMCP.Comm.Channel.Text.talker !== args[1]) {\n return;\n}\n\n// This triggers an event in my personal affliction tracking system. Left in place as\n// an example of how it might be used.\nif (GMCP.Target === args[2])\n eventStream.raiseEvent(`${args[3]}GotInsightAff`);"}],"text":"^\\(Party\\): (\\w+) says, \"(\\w+): (\\w+)\\.\"$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"Party Target 1","enabled":true,"actions":[{"type":"script","enabled":true,"script":"//GMCP safeguard\nif (GMCP.Comm.Channel.Text.talker !== args[1]) {\n return;\n}\n\nconst id = args[2].charAt(0).toUpperCase() + args[2].slice(1);\nif (\n nexGui.state.party.settings.targetCalls && \n args[1] === nexGui.state.party.leader && \n nexGui.api.players.get(GMCP.Char.Status.name).city !== nexGui.api.players.get(id)?.city\n) {\n nexusclient.send_commands(`settarget ${args[2]}`);\n nexusclient.send_commands(`enemy ${args[2]}`);\n}"}],"text":"^\\(Party\\): (\\w+) says, \"Target: (.+)\\.\"$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"Party Target 2","enabled":true,"actions":[{"type":"script","enabled":true,"script":"//GMCP safeguard\nif (GMCP.Comm.Channel.Text.talker !== args[1]) {\n return;\n}\n\nconst id = args[2].charAt(0).toUpperCase() + args[2].slice(1);\nif (\n nexGui.state.party.settings.targetCalls && \n args[1] === nexGui.state.party.leader && \n nexGui.api.players.get(GMCP.Char.Status.name).city !== nexGui.api.players.get(id)?.city\n) {\n nexusclient.send_commands(`settarget ${args[2]}`);\n nexusclient.send_commands(`enemy ${args[2]}`);\n}"}],"text":"^\\(Party\\): (\\w+) says, \"(?:Target|TARGET) (.+)\\.\"$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"Party Enemy","enabled":true,"actions":[{"type":"script","enabled":true,"script":"//GMCP safeguard\nif (GMCP.Comm.Channel.Text.talker !== args[1]) {\n return;\n}\n\n//(Party): Dunn says, \"Enemy Auri.\"\nif (nexGui.state.party.settings.targetCalls && args[1] === nexGui.state.party.leader) {\n nexusclient.send_commands(`enemy ${args[2]}`);\n}"}],"text":"^\\(Party\\): (\\w+) says, \"Enemy (.+)\\.\"$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"Party Follow","enabled":true,"actions":[{"type":"script","enabled":true,"script":"if (nexGui.api.party.isMember(args[1])) {\n\tnexusclient.send_commands(`follow ${args[1]}`);\n}"}],"text":"^(\\w+) makes a beckoning motion\\.$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"Party Block","enabled":true,"actions":[{"type":"script","enabled":true,"script":"//GMCP safeguard\nif (GMCP.Comm.Channel.Text.talker !== args[1]) {\n return;\n}\n\nconst validBlocks = [\"n\", \"e\", \"s\", \"w\", \"ne\", \"se\", \"sw\", \"nw\", \"d\", \"u\", \"down\", \"up\", \"north\", \"east\", \"south\", \"west\", \"northeast\", \"southeast\", \"southwest\", \"northwest\", \"in\", \"out\"];\n\nif (validBlocks.includes(args[1].toLowerCase())) {\n nexusclient.send_commands(`block ${args[1]}`);\n}"}],"text":"^\\(Party\\): \\w+ says, \"Block (\\w+).\"$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"Party Unblock","enabled":true,"actions":[{"type":"script","enabled":true,"script":"//GMCP safeguard\nif (GMCP.Comm.Channel.Text.talker !== args[1]) {\n return;\n}\n\nnexusclient.send_commands('unblock');"}],"text":"^\\(Party\\): \\w+ says, \"Unblock\\.\"$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"nexSys.api.defs.setDefaultPriority('blocking', 0);"}],"text":"Block is not a valid command.","matching":"exact","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"nexSys.api.defs.setDefaultPriority('blocking', 0);"}],"text":"You need to be mounted to block.","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"nexSys.api.defs.setDefaultPriority('blocking', 0);"}],"text":"There is no exit to block that way.","matching":"regexp","whole_words":true,"case_sensitive":true}]},{"type":"group","name":"nexGui.timer","enabled":true,"actions":[],"items":[{"type":"trigger","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"// Example of how to start timers.\nnexGui.api.timers.start('tree')"}],"text":"^You touch the tree of life tattoo\\.$","matching":"regexp","whole_words":true,"case_sensitive":true}]},{"type":"group","name":"nexGui.msg","enabled":true,"actions":[],"items":[{"type":"trigger","name":"Smiley face gag","enabled":true,"actions":[{"type":"script","enabled":true,"script":"for(let i = 0; i < nexusclient.current_block.length; i++) {\n\tif (!nexusclient.current_line.is_prompt) {\n\t\tnexusclient.current_block[i].gag = true;\n }\n}"}],"text":" ..o@@@@@@@@@@@@@o..","matching":"exact","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"AlertnessHere","enabled":true,"actions":[{"type":"script","enabled":true,"script":"const players = [args[1]];\nconst re = /^Your enhanced senses inform you that (\\w+) has entered .+ at your location\\.$/;\nconst index = nexusclient.current_block.findIndex(e => e === nexusclient.current_line);\nconst testBlock = () => {\n for (let i = index + 1; i < nexusclient.current_block.length - 1; i++) {\n const txt = nexusclient.current_block[i].parsed_line?.text();\n const match = txt.match(re);\n if (match) {\n players.push(match[1]);\n\t nexusclient.current_block[i].gag = true;\n }\n }\n\n}\ntestBlock();\nconsole.log(nexusclient.current_block);\n\nconst line = document.createElement('span');\n\nconst left = document.createElement('span');\nleft.textContent = \"[\";\nleft.style.color = \"red\";\nline.appendChild(left);\n\nplayers.forEach(p => {\n const player = document.createElement('span');\n player.textContent = `${p} `;\n player.style.color = nexGui.api.colors.playerColor(p);\n line.appendChild(player);\n})\n\nconst dir = document.createElement('span');\ndir.textContent = \"- Here\";\ndir.style.color = 'white';\nline.appendChild(dir);\n\nconst right = document.createElement('span');\nright.textContent = \"]\";\nright.style.color = \"red\";\nline.appendChild(right);\n\nnexSys.api.line.replaceHTML(line.outerHTML);"}],"text":"^Your enhanced senses inform you that (\\w+) has entered .+ at your location\\.$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"AlertnessThere","enabled":true,"actions":[{"type":"script","enabled":true,"script":"const players = [args[1]];\nconst re = /^Your enhanced senses inform you that (\\w+) has entered .+, to the (\\w+)\\.$/;\nconst index = nexusclient.current_block.findIndex(e => e === nexusclient.current_line);\n\nconst testBlock = () => {\n for (let i = index + 1; i < nexusclient.current_block.length - 1; i++) {\n const txt = nexusclient.current_block[i].parsed_line?.text();\n const match = txt.match(re);\n if (match) {\n players.push(match[1]);\n\t nexusclient.current_block[i].gag = true;\n }\n }\n\n}\ntestBlock();\nconsole.log(nexusclient.current_block);\n\nconst line = document.createElement('span');\n\nconst left = document.createElement('span');\nleft.textContent = \"[\";\nleft.style.color = \"red\";\nline.appendChild(left);\n\nplayers.forEach(p => {\n const player = document.createElement('span');\n player.textContent = `${p} `;\n player.style.color = nexGui.api.colors.playerColor(p);\n line.appendChild(player);\n})\n\nconst dir = document.createElement('span');\ndir.textContent = `- ${args[2].capitalize()}`;\ndir.style.color = 'cyan';\nline.appendChild(dir);\n\nconst right = document.createElement('span');\nright.textContent = \"]\";\nright.style.color = \"red\";\nline.appendChild(right);\n\nnexSys.api.line.replaceHTML(line.outerHTML);\n"}],"text":"^Your enhanced senses inform you that (\\w+) has entered .+, to the (\\w+)\\.$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"","enabled":true,"actions":[],"text":"^(\\w+) wanders into view directly below\\.$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"","enabled":true,"actions":[],"text":"^(\\w+) wanders out of sight from below you\\.$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"","enabled":true,"actions":[],"text":"^(\\w+) flies away to the beyond\\.$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"","enabled":true,"actions":[],"text":"^(\\w+) flits into view directly overhead\\.$","matching":"regexp","whole_words":true,"case_sensitive":true}]},{"type":"group","name":"nexGui.stream","enabled":true,"actions":[],"items":[{"type":"trigger","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"// This block gags all of the curing text that follows the [Curing] msg.\n// things like sipping the health vial. Only the [Curing] (text). is displayed.\nnexusclient.current_line.parsed_line.chunks[nexusclient.current_line.parsed_line.chunks.length-1]._txt = nexusclient.current_line.parsed_line.chunks[nexusclient.current_line.parsed_line.chunks.length-1]._txt.toLowerCase();\n\nconst index = nexusclient.current_line.index;\nfor(let i = index + 1; i < index + 3 && i < nexusclient.current_block.length; i++) {\n\tif (nexusclient.current_block[i].is_prompt) {\n break;\n }\n if (nexusclient.current_block[i].line) {\n nexusclient.current_block[i].gag = true;\n nexusclient.current_block[i].log = true;\n }\n}\n\nif (args[1] === 'CLOT') {\n /*clotCount++;\n if (clotCount > 1) {\n nexGui.stream.system.revise([\n `<span style=\"color: #800000; \">[Curing]:</span>`,\n `<span style=\"color: #aaaaaa\" class=\"nexGui-Clot\">Clot x${clotCount}</span>`\n ]);\n } else {\n nexGui.api.stream.add({\n html: `<span style=\"color: #800000; \">[Curing]: </span><span style=\"color: #aaaaaa\" class=\"nexGui-Clot\">Clot</span>`,\n stream: \"system\",\n });\n \tnexGui.stream.system.add([\n `<span style=\"color: #800000; \">[Curing]:</span>`,\n `<span style=\"color: #aaaaaa\" class=\"nexGui-Clot\">Clot</span>`\n ]);\n }*/\n} else {\n clotCount = 0;\n nexGui.api.stream.add({\n html: `<span style='color:#800000'>[Curing]: </span><span class='mono'>${args[1]}</span>`,\n stream: \"system\",\n });\n //nexGui.stream.system.add([`<span style='color:#800000'>[Curing]:</span>`,`<span class='mono'>${args[1].toProperCase()}</span>`]);\n}\n\nnexusclient.current_line.gag = true;\nnexusclient.current_line.log = true;"}],"text":"^\\[Curing\\]: (.+)$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"","enabled":false,"actions":[{"type":"script","enabled":true,"script":"nexGui.stream.system.add([`<span style=\"color:deepskyblue\">[Prio] ${args[2]}</span>`,`<span>${args[1].toProperCase()}</span>`]);"}],"text":"^You have set the \\'(\\w+)\\' defence to the (\\d+) priority\\.$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"","enabled":false,"actions":[{"type":"script","enabled":true,"script":"nexGui.stream.system.add([\n `<span style=\"color:deepskyblue\">[Prio] ${args[2]}</span>`,\n `<span>${args[1].toProperCase()}</span>`\n ]);"}],"text":"^You have set the \\'(\\w+)\\' affliction to the (\\d+) priority\\.$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"","enabled":false,"actions":[{"type":"script","enabled":true,"script":"nexGui.stream.combat.add([\n `<span style=\"color:red\">[Target]</span>`,\n `<span class=\"mono\">${GMCP.IRE.Target.Info.short_desc}</span>`\n ]);"}],"text":"^Your target is now: (.+)$","matching":"regexp","whole_words":true,"case_sensitive":true}]},{"type":"group","name":"nexGui.who","enabled":true,"items":[{"type":"alias","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"nexAction.triggers.enable(\"nexGui4.who.quickWhoCapture\");\nnexusclient.send_commands(\"qwc\");"}],"text":"qw","matching":"exact","whole_words":true,"case_sensitive":true,"prefix_suffix":true},{"type":"alias","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"nexAction.triggers.enable(\"nexGui4.who.quickWhoCapture\");\nnexusclient.send_commands(\"qwc\");"}],"text":"qwl","matching":"exact","whole_words":true,"case_sensitive":true,"prefix_suffix":true},{"type":"alias","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"//TODO\n//nexusclient.reflexes().enable_reflex(nexusclient.reflexes().find_by_name(\"group\", \"nexGui.who.capture\", true, false, \"nexGui4\"));\nnexusclient.send_commands('who brief');"}],"text":"qwb","matching":"exact","whole_words":true,"case_sensitive":true,"prefix_suffix":true},{"type":"alias","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"//TODO\n//nexusclient.reflexes().enable_reflex(nexusclient.reflexes().find_by_name(\"group\", \"nexGui.who.capture\", true, false, \"nexGui4\"));\nnexusclient.send_commands('who brief');"}],"text":"qwhom","matching":"exact","whole_words":true,"case_sensitive":true,"prefix_suffix":true},{"type":"trigger","name":"qw capture","enabled":false,"actions":[{"type":"script","enabled":true,"script":"// nexGui4 — Quick Who City capture\n\n// Server QWC name colors (the colors Achaea sends in the qwc block) → city key.\nconst nexusColors = {\n \"#800080\": \"ashtan\",\n \"#008080\": \"cyrene\",\n \"#00ff00\": \"eleusis\",\n \"#808000\": \"hashan\",\n \"#ff0000\": \"mhaldor\",\n \"#ffffff\": \"targossas\",\n \"#c0c0c0\": \"(none)\",\n \"#008000\": \"garden\",\n \"#ffff00\": \"garden\",\n};\n// Gag the raw server block; nexGui re-renders it with its own city colors.\nnexusclient.current_block.forEach((b) => (b.gag = true));\n\nconst qwcList = [];\n\nnexusclient.current_block[0].parsed_line.chunks.forEach((e) => {\n if (!e._txt || !e._color) return;\n\n const name = e._txt;\n qwcList.push(name); // collect for formatting\n\n const profile = nexGui.api.players.get(name); // frozen snapshot or null\n const gameCity = nexusColors[e._color.toLowerCase()];\n\n if (!profile) {\n // nexGui has never seen this character.\n nexGui.api.display.notice(`nexGui: directory entry missing for ${name}`);\n console.log(`nexGui: directory entry missing for ${name}`);\n return;\n }\n\n // Genuine city change: the live QWC color disagrees with the cached city.\n if (gameCity && profile.city !== gameCity) {\n nexGui.api.display.notice(\n `City mismatch: ${name} game: ${gameCity}, nexGui: ${profile.city}`,\n );\n console.log(`City mismatch: ${name} game: ${gameCity}, nexGui: ${profile.city}`);\n\n // The directory is authoritative and read-only to scripts — don't mutate\n // the cache by hand. Force a refresh from the public API instead; this\n // re-pulls the profile and updates the directory + crowdsource cache.\n nexGui.api.players.fetch(name).catch(() => {});\n }\n});\n\nnexGui.api.players.qwFormat(qwcList);\n\n// One-shot: re-disable this capture trigger until the next qwc is sent.\nnexusclient\n .reflexes()\n .disable_reflex(\n nexusclient.reflexes().find_by_name(\"trigger\", \"qw capture\", true, false, \"nexGui4\"),\n );"}],"text":"^.*\\(\\d+ total\\)\\.$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"group","name":"nexGui.who.capture","enabled":false,"items":[{"type":"trigger","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"nexusclient.current_line.gag = true;\nnexGui.cdb.qwbCapture(args[1], args[2]);"}],"text":"^(\\w+)\\s+\\((.+)\\)$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"nexusclient.current_line.gag = true;\nnexGui.cdb.qwbCapture(args[1], 'unknown');\nreturn;\nlet area = { name: 'unknown' };\nif (typeof nexWho.capturedAreas[area.name] === 'undefined') {\n nexWho.capturedAreas[area.name] = {}\n nexWho.capturedAreas[area.name]['Embracing Death'] = [args[1]];\n} else if (typeof nexWho.capturedAreas[area.name]['Embracing Death'] === 'undefined') {\n nexWho.capturedAreas[area.name]['Embracing Death'] = [args[1]];\n} else {\n nexWho.capturedAreas[area.name]['Embracing Death'].push(args[1]);\n}"}],"text":"^\\(Embracing Death\\)\\s+(\\w+)\\.$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"nexusclient.current_line.gag = true;\nnexGui.cdb.qwbCapture(`Soul ${args[1]}`, args[2]);\nreturn;\nlet area = nexWho.mudmap.areas.find(a => a.rooms.find(r => r.name?.indexOf(args[2]) === 0));\nif (typeof area === 'undefined') { area = { name: 'unknown' }; }\nif (typeof nexWho.capturedAreas[area.name] === 'undefined') {\n nexWho.capturedAreas[area.name] = {}\n nexWho.capturedAreas[area.name][args[2]] = [`Soul ${args[1]}`];\n} else if (typeof nexWho.capturedAreas[area.name][args[2]] === 'undefined') {\n nexWho.capturedAreas[area.name][args[2]] = [`Soul ${args[1]}`];\n} else {\n nexWho.capturedAreas[area.name][args[2]].push(`Soul ${args[1]}`);\n}"}],"text":"^The soul of (\\w+)\\s+\\((.+)\\)$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"nexusclient.current_line.gag = true;"}],"text":"^(\\w+)$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"nexusclient.current_line.gag = true;\nnexusclient.send_commands('more');"}],"text":"^\\[Type MORE if you wish to continue reading\\. \\((\\d+)% shown\\)\\]$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"nexusclient.current_line.gag = true;"}],"text":"^\\[File continued via MORE\\]$","matching":"regexp","whole_words":true,"case_sensitive":true},{"type":"trigger","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"nexusclient.current_line.gag = true;\n\nnexGui.cdb.qwbDisplay();\n\nnexusclient.reflexes().disable_reflex(nexusclient.reflexes().find_by_name(\"group\", \"nexGui.who.capture\", true, false, \"nexGui4\"));"}],"text":"^Total: (\\d+)$","matching":"regexp","whole_words":true,"case_sensitive":true}]}]},{"type":"group","name":"nexGui.classCustomizations","enabled":true,"actions":[],"items":[{"type":"function","name":"nexGui.occultist","enabled":true,"code":"// nexSys is a dependency for some of these checks.\n// The code is still useful for examples on user customizations.\nif (typeof nexSys === \"undefined\") { return; }\n\n/*\n This is the GMCP property for your class balance.\n This will control the state of the class balance icon which is added as\n an hourglass on the footer.\n*/\nnexGui.api.customize.classBalance.set('Entity');\n\n/*\n Populates the nexGui defence array with defences from nexSys\n for your class which you have set a priority for.\n*/\nconst defs = Object.values(nexSys.state.defs).filter(d => d.priority > 0 && d.skills.includes(nexSys.state.class)).map(d => d.id);\nnexGui.api.customize.defences.set(defs);\n\n// Update this to match whatever tattoos you like to maintain\nnexGui.api.customize.defences.set([\n ...nexGui.state.customize.defences,\n 'oxtattoo', 'boartattoo', 'megalithtattoo', 'chameleon', 'starburst', 'mosstattoo', 'grookbubble', 'nicatorlegend', 'astronomy',\n]);\n\n// Clear only the timers belonging to this class, identified by groupId.\n// Using .clear() with no argument removes ALL timers — a clean slate. May or may not be desired.\n// nexGui.api.timers.clear();\nnexGui.api.timers.clear('myClass');\n\n// Add timers starting from the top.\n// nexGui.api.timers.add(id, durationMs, label, options)\n// durationMs is in milliseconds. direction: 'countup' counts up from zero, 'countdown' counts down to zero.\n// Assigning a groupId ties these timers to this class — nexGui.api.timers.clear('myClass') removes only these.\nnexGui.api.timers.add('tree', 15000, 'Tree Tattoo', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('fool', 35000, 'Fool', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('sunTick', 25000, 'Sun Tick', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('crystaltattoo', 3600000, 'Crystal Tattoo', { direction: 'countup', groupId: 'myClass' });\n\n// Add timers starting from the bottom.\nnexGui.api.timers.add('tentacles', 45000, 'Tentacles', { direction: 'countdown', stayVisible: false, position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('arctar', 45000, 'Arctar Orb', { direction: 'countdown', stayVisible: false, position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('sunOrb', 180000, 'Sun Orb', { direction: 'countdown', stayVisible: false, position: 'bottom', groupId: 'myClass' });\n"},{"type":"function","name":"nexGui.magi","enabled":true,"code":"// nexSys is a dependency for some of these checks\nif (typeof nexSys === \"undefined\") { return; }\n\nconst defs = Object.values(nexSys.state.defs).filter(d => d.priority > 0 && d.skills.includes(nexSys.state.class)).map(d => d.id);\nnexGui.api.customize.defences.set(defs);\n\n// Update this to match whatever tattoos you like to maintain\nnexGui.api.customize.defences.set([\n ...nexGui.state.customize.defences,\n 'oxtattoo', 'boartattoo', 'megalithtattoo', 'chameleon', 'starburst', 'mosstattoo', 'grookbubble', 'nicatorlegend', 'astronomy',\n 'stonefist', 'stoneskin', 'diamondskin', 'chargeshield'\n]);\n\n// Clear existing timers\nnexGui.api.timers.clear('myClass');\n\n// Timers at the top of panel\nnexGui.api.timers.add('tree', 15000, 'Tree Tattoo', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('crystaltattoo', 3600000, 'Crystal Tattoo', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('vibes', 2400000, 'Vibes', { direction: 'countdown', groupId: 'myClass' });\n// Timers at the bottom of panel\nnexGui.api.timers.add('stormbolt', 27000, 'Stormbolt', { direction: 'countup', position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('dilation', 35000, 'Dilation', { direction: 'countup', position: 'bottom', groupId: 'myClass' });"},{"type":"function","name":"nexGui.runewarden","enabled":true,"code":"// nexSys is a dependency for some of these checks. \n//The code is still useful for examples on User customizations.\nif (typeof nexSys === \"undefined\") { return; }\n"},{"type":"function","name":"nexGui.reddragon","enabled":true,"code":"// nexSys is a dependency for some of these checks\nif (typeof nexSys === \"undefined\") { return; }\n\nconst defs = Object.values(nexSys.state.defs).filter(d => d.priority > 0 && d.skills.includes(nexSys.state.class)).map(d => d.id);\nnexGui.api.customize.defences.set(defs);\n\n// Update this to match whatever tattoos you like to maintain\nnexGui.api.customize.defences.set([\n ...nexGui.state.customize.defences,\n 'oxtattoo', 'boartattoo', 'megalithtattoo', 'chameleon', 'starburst', 'mosstattoo', 'grookbubble', 'nicatorlegend', 'astronomy',\n]);\n\n// Clear existing timers\nnexGui.api.timers.clear('myClass');\n\n// Timers at the top of panel\nnexGui.api.timers.add('tree', 15000, 'Tree Tattoo', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('dragonheal', 20000, 'Dragon Heal', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('crystaltattoo', 3600000, 'Crystal Tattoo', { direction: 'countup', groupId: 'myClass' });\n// Timers at the bottom of panel\nnexGui.api.timers.add('dragontaunt', 19000, 'Dragontaunt', { direction: 'countup', position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('scorch', 25000, 'Scorch', { direction: 'countup', position: 'bottom', groupId: 'myClass' });"},{"type":"function","name":"nexGui.bluedragon","enabled":true,"code":"// nexSys is a dependency for some of these checks\nif (typeof nexSys === \"undefined\") { return; }\n\n// All defenses that have a priority set by default\nconst defs = Object.values(nexSys.state.defs).filter(d => d.priority > 0 && d.skills.includes(nexSys.state.class)).map(d => d.id);\nnexGui.api.customize.defences.set(defs);\n\n// Update this to match whatever tattoos you like to maintain\nnexGui.api.customize.defences.set([\n ...nexGui.state.customize.defences,\n 'oxtattoo', 'boartattoo', 'megalithtattoo', 'chameleon', 'starburst', 'mosstattoo', 'grookbubble', 'nicatorlegend', 'astronomy',\n]);\n\n// Clear existing timers\nnexGui.api.timers.clear('myClass');\n\n// Timers at the top of panel\nnexGui.api.timers.add('tree', 15000, 'Tree Tattoo', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('dragonheal', 20000, 'Dragon Heal', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('crystaltattoo', 3600000, 'Crystal Tattoo', { direction: 'countup', groupId: 'myClass' });\n// Timers at the bottom of panel\nnexGui.api.timers.add('dragonchill', 16000, 'Dragonchill', { direction: 'countup', position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('ague', 23000, 'Ague', { direction: 'countup', position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('glaciate', 33000, 'Glaciate', { direction: 'countup', position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('override', 23000, 'Override', { direction: 'countup', position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('frostwave', 23000, 'Frostwave', { direction: 'countup', position: 'bottom', groupId: 'myClass' });"},{"type":"function","name":"nexGui.goldendragon","enabled":true,"code":"// nexSys is a dependency for some of these checks\nif (typeof nexSys === \"undefined\") { return; }\n\n// All defenses that have a priority set by default\nconst defs = Object.values(nexSys.state.defs).filter(d => d.priority > 0 && d.skills.includes(nexSys.state.class)).map(d => d.id);\nnexGui.api.customize.defences.set(defs);\n\n// Update this to match whatever tattoos you like to maintain\nnexGui.api.customize.defences.set([\n ...nexGui.state.customize.defences,\n 'oxtattoo', 'boartattoo', 'megalithtattoo', 'chameleon', 'starburst', 'mosstattoo', 'grookbubble', 'nicatorlegend', 'astronomy',\n]);\n\n// Clear existing timers\nnexGui.api.timers.clear('myClass');\n\n// Timers at the top of panel\nnexGui.api.timers.add('tree', 15000, 'Tree Tattoo', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('dragonheal', 20000, 'Dragon Heal', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('crystaltattoo', 3600000, 'Crystal Tattoo', { direction: 'countup', groupId: 'myClass' });\n// Timers at the bottom of panel\nnexGui.api.timers.add('deaden', 35000, 'Deaden', { direction: 'countup', position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('psidaze', 40000, 'Psidaze', { direction: 'countup', position: 'bottom', groupId: 'myClass' });"}]},{"type":"group","name":"nexGui.userSettings","enabled":true,"items":[]},{"type":"alias","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"const layout = {\n layout: JSON.stringify(nexusclient.ui().layout().model().layout),\n borders: JSON.stringify(nexusclient.ui().layout().model().borders),\n}\nnexusclient.variables().vars.nexGui4Layout = layout;\nnexusclient.ui().layout().model().layout = JSON.parse(\"{\\\"type\\\":\\\"row\\\",\\\"id\\\":\\\"main\\\",\\\"children\\\":[{\\\"type\\\":\\\"row\\\",\\\"id\\\":\\\"#70e4ecdf-81dc-40c6-b536-b62595eff99b\\\",\\\"weight\\\":57.26509774852639,\\\"children\\\":[{\\\"type\\\":\\\"tabset\\\",\\\"id\\\":\\\"#f85f4040-6d4a-49c7-94bd-7244f1a3b32d\\\",\\\"weight\\\":17.557736227615205,\\\"selected\\\":1,\\\"children\\\":[{\\\"type\\\":\\\"tab\\\",\\\"id\\\":\\\"map\\\",\\\"name\\\":\\\"Map\\\",\\\"helpText\\\":\\\"Map\\\",\\\"component\\\":\\\"map\\\",\\\"icon\\\":\\\"route\\\"},{\\\"type\\\":\\\"tab\\\",\\\"id\\\":\\\"nexMap\\\",\\\"name\\\":\\\"nexMap\\\",\\\"helpText\\\":\\\"nexMap\\\",\\\"component\\\":\\\"nexMap\\\",\\\"icon\\\":\\\"feather-pointed\\\"}]},{\\\"type\\\":\\\"row\\\",\\\"id\\\":\\\"#bcb4f90b-4716-4f9b-9b22-ffd8741be626\\\",\\\"weight\\\":7.090289581370549,\\\"children\\\":[{\\\"type\\\":\\\"tabset\\\",\\\"id\\\":\\\"#b54bf1ab-4145-4041-9e67-8e6b789724b1\\\",\\\"weight\\\":11.363636363636363,\\\"children\\\":[{\\\"type\\\":\\\"tab\\\",\\\"id\\\":\\\"nexPlayers\\\",\\\"name\\\":\\\"nexPlayers\\\",\\\"helpText\\\":\\\"nexPlayers\\\",\\\"component\\\":\\\"nexPlayers\\\",\\\"icon\\\":\\\"feather-pointed\\\"}]},{\\\"type\\\":\\\"tabset\\\",\\\"id\\\":\\\"#3df7c443-17f5-406e-9a45-54879deb731e\\\",\\\"weight\\\":26.79425837320574,\\\"children\\\":[{\\\"type\\\":\\\"tab\\\",\\\"id\\\":\\\"nexNpcs\\\",\\\"name\\\":\\\"nexNpcs\\\",\\\"helpText\\\":\\\"nexNpcs\\\",\\\"component\\\":\\\"nexNpcs\\\",\\\"icon\\\":\\\"feather-pointed\\\"}]},{\\\"type\\\":\\\"tabset\\\",\\\"id\\\":\\\"#5c7c36a2-9496-4e6f-a1df-c581f898f7ac\\\",\\\"weight\\\":36.8421052631579,\\\"children\\\":[{\\\"type\\\":\\\"tab\\\",\\\"id\\\":\\\"nexItems\\\",\\\"name\\\":\\\"nexItems\\\",\\\"helpText\\\":\\\"nexItems\\\",\\\"component\\\":\\\"nexItems\\\",\\\"icon\\\":\\\"feather-pointed\\\"}],\\\"active\\\":true}]},{\\\"type\\\":\\\"tabset\\\",\\\"id\\\":\\\"#1eaac23b-4eae-486d-8915-90a25f41f9e0\\\",\\\"weight\\\":2.6494514015995967,\\\"children\\\":[{\\\"type\\\":\\\"tab\\\",\\\"id\\\":\\\"all_comm\\\",\\\"name\\\":\\\"All Comm\\\",\\\"helpText\\\":\\\"Global Communication Window\\\",\\\"component\\\":\\\"all_comm\\\",\\\"icon\\\":\\\"message-lines\\\"}]},{\\\"type\\\":\\\"tabset\\\",\\\"id\\\":\\\"#fdd3f126-a4e3-4f24-9e2b-03b2f25825ec\\\",\\\"weight\\\":30.58912072755898,\\\"enableDrop\\\":false,\\\"enableTabStrip\\\":false,\\\"children\\\":[{\\\"type\\\":\\\"tab\\\",\\\"id\\\":\\\"#90968890-c02d-44ac-947a-5651201350c8\\\",\\\"component\\\":\\\"center\\\"}]}]}]}\");\n\nnexusclient.ui().layout().model().borders = JSON.parse(\n '[{\"type\":\"border\",\"size\":700,\"location\":\"right\",\"children\":[{\"type\":\"tab\",\"id\":\"nexOptions\",\"name\":\"nexOptions\",\"helpText\":\"nexOptions\",\"component\":\"nexOptions\",\"icon\":\"feather-pointed\",\"borderWidth\":300},{\"type\":\"tab\",\"id\":\"nexParty\",\"name\":\"nexParty\",\"helpText\":\"nexParty\",\"component\":\"nexParty\",\"icon\":\"feather-pointed\",\"borderWidth\":300},{\"type\":\"tab\",\"id\":\"nexMetrics\",\"name\":\"nexMetrics\",\"helpText\":\"nexMetrics\",\"component\":\"nexMetrics\",\"icon\":\"feather-pointed\"},{\"type\":\"tab\",\"id\":\"nexStats\",\"name\":\"nexStats\",\"helpText\":\"nexStats\",\"component\":\"nexStats\",\"icon\":\"feather-pointed\",\"borderWidth\":725},{\"type\":\"tab\",\"id\":\"nexCombat\",\"name\":\"nexCombat\",\"helpText\":\"nexCombat\",\"component\":\"nexCombat\",\"icon\":\"feather-pointed\"},{\"type\":\"tab\",\"id\":\"nexSystem\",\"name\":\"nexSystem\",\"helpText\":\"nexSystem\",\"component\":\"nexSystem\",\"icon\":\"feather-pointed\"},{\"type\":\"tab\",\"id\":\"nexTarget\",\"name\":\"nexTarget\",\"helpText\":\"nexTarget\",\"component\":\"nexTarget\",\"icon\":\"feather-pointed\"},{\"type\":\"tab\",\"id\":\"nexDefences\",\"name\":\"nexDefences\",\"helpText\":\"nexDefences\",\"component\":\"nexDefences\",\"icon\":\"feather-pointed\"},{\"type\":\"tab\",\"id\":\"nexTimers\",\"name\":\"nexTimers\",\"helpText\":\"nexTimers\",\"component\":\"nexTimers\",\"icon\":\"feather-pointed\"},{\"type\":\"tab\",\"id\":\"nexFeed\",\"name\":\"nexFeed\",\"helpText\":\"nexFeed\",\"component\":\"nexFeed\",\"icon\":\"feather-pointed\"}]}]'\n);\n"}],"text":"ng mobile","matching":"exact","whole_words":true,"case_sensitive":true,"prefix_suffix":true},{"type":"alias","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"console.log('browser');\nconst layout = nexusclient.variables().vars.nexGui4Layout;\nconsole.log(layout);\nnexusclient.ui().layout().model().layout = JSON.parse(layout.layout);\n\nnexusclient.ui().layout().model().borders = JSON.parse(layout.borders);"}],"text":"ng browser","matching":"exact","whole_words":true,"case_sensitive":true,"prefix_suffix":true},{"type":"alias","name":"","enabled":true,"actions":[{"type":"script","enabled":true,"script":"/**\nThis alias is for debugging purposes only.\nPlayers should never need to use this.\n*/\nreturn;\nnexDrop.import('nexgui4.min').then(() => {\n setTimeout(()=>{\n nexGui.bootstrapNexus();\n\n // nexusclient.packages().get('nexGui4').items.find(e => e.name == \"nexGui.colors\").items.find(e => e.name == \"balances\").enabled\n }, 2000)\n});"}],"text":"ng load","matching":"exact","whole_words":true,"case_sensitive":true,"prefix_suffix":true},{"type":"alias","name":"","enabled":false,"actions":[{"type":"script","enabled":true,"script":"if (typeof nexGui === 'undefined' /*|| typeof Realm === 'undefined'*/) { return; }\n\nnexGui.aliases.call(args[1], args[2] ? args[2] : false)"}],"text":"^ng (\\w+)\\s?(.+)?$","matching":"regexp","whole_words":true,"case_sensitive":true,"prefix_suffix":true}],"description":"Khaseem's Nexus GUI for Nexus 3.0"}
1
+ {
2
+ "type": "group",
3
+ "name": "nexGui4",
4
+ "enabled": true,
5
+ "items": [
6
+ {
7
+ "type": "function",
8
+ "name": "__meta",
9
+ "enabled": true,
10
+ "code": "{\n\t\"description\": \"nexGui4 Achaea enhancements for the Nexus client\",\n \"version\": \"1.2.4\",\n \"website\": \"https://github.com/NexusUnleashed/nexgui4\",\n \"dependencies\": [\n \"eventStream4\",\n \"nexSys4\"\n ]\n}"
11
+ },
12
+ {
13
+ "type": "function",
14
+ "name": "SCRATCH",
15
+ "enabled": true,
16
+ "code": "/* Khaseem's scratch pad */\n/*\n\n*/\n"
17
+ },
18
+ {
19
+ "type": "function",
20
+ "name": "README",
21
+ "enabled": true,
22
+ "code": "/***************************************************************************************************\nAdd instructions here\n****************************************************************************************************/"
23
+ },
24
+ {
25
+ "type": "function",
26
+ "name": "onInstall",
27
+ "enabled": true,
28
+ "code": "nexusclient.reflexes().run_function('onLoad', {}, 'nexGui4');\nconst np = nexusclient.packages();\nif (!np.exists('eventStream4')) {\n fetch(`https://unpkg.com/nexevent/eventStream4.nxs`, { cache: \"no-store\" })\n .then((r) => r.json())\n .then((d) => {\n const p = np.create('eventStream4', 'placeholder');\n p.name = \"eventStream4\";\n const i = np.exists('eventStream4');\n np.move(i - 1, 1);\n np\n .get(\"eventStream4\")\n .apply(d, nexusclient.reflexes());\n setTimeout(()=>{\n nexusclient.reflexes().run_function('onLoad', {}, 'eventStream4');\n },0)\n });\n}"
29
+ },
30
+ {
31
+ "type": "function",
32
+ "name": "onLoad",
33
+ "enabled": true,
34
+ "code": "globalThis.React ??= nexusclient.platform().React;\nglobalThis.ReactDOM ??= nexusclient.platform().ReactDOM;\n\nglobalThis.GMCP ??= nexusclient.datahandler().GMCP;\n\nnexusclient.packages().get('nexGui4').items.filter(item => item.type === 'group').forEach(group => group.enabled = false);"
35
+ },
36
+ {
37
+ "type": "function",
38
+ "name": "SystemLoaded",
39
+ "enabled": true,
40
+ "code": "//return;\nimport('https://unpkg.com/nexgui4/dist/nexgui4.min.js').then(() => {\n nexusclient.packages().get('nexGui4').items.filter(item => item.type === 'group').forEach(group => group.enabled = true);\n nexGui.bootstrapNexus();\n});"
41
+ },
42
+ {
43
+ "type": "group",
44
+ "name": "nexGui.colors",
45
+ "enabled": true,
46
+ "actions": [],
47
+ "items": [
48
+ {
49
+ "type": "group",
50
+ "name": "balances",
51
+ "enabled": true,
52
+ "items": [
53
+ {
54
+ "type": "trigger",
55
+ "name": "Bal Recover",
56
+ "enabled": true,
57
+ "actions": [
58
+ {
59
+ "type": "script",
60
+ "enabled": true,
61
+ "script": "const seconds = nexSys?.state?.balances?.balance?.lastServerDurationSeconds;\nconst label = Number(seconds) > 0 ? `(${Number(seconds).toFixed(2)})` : \"\";\n\nconst rule = (color) =>\n `<span style=\"flex:1;min-width:0;align-self:center;height:0;border-top:3px double ${color};\"></span>`;\n\n// inline-flex keeps it on the timestamp's line; the constant 15ch reservation\n// matches the skill replacement rows so balance + skill lines align.\nconst html =\n `<span style=\"display:inline-flex;align-items:center;width:calc(100% - 15ch);gap:.75ch;overflow:hidden;vertical-align:middle;\">` +\n rule(\"#33cc33\") +\n `<span style=\"flex:0 0 auto;white-space:nowrap;\">` +\n `<span style=\"color:#33cc33;\">BALANCE&nbsp;&nbsp;&nbsp;&nbsp;</span>` +\n (label ? ` <span style=\"color:#00ccff;\">${label}</span>` : ``) +\n `</span>` +\n rule(\"#00ccff\") +\n `</span>`;\n\nnexSys.api.line.replaceHTML(html);\n"
62
+ }
63
+ ],
64
+ "text": "You have recovered balance on all limbs.",
65
+ "matching": "exact",
66
+ "whole_words": true,
67
+ "case_sensitive": true
68
+ },
69
+ {
70
+ "type": "trigger",
71
+ "name": "Eq Recover",
72
+ "enabled": true,
73
+ "actions": [
74
+ {
75
+ "type": "script",
76
+ "enabled": true,
77
+ "script": "const seconds = nexSys?.state?.balances?.equilibrium?.lastServerDurationSeconds;\nconst label = Number(seconds) > 0 ? `(${Number(seconds).toFixed(2)})` : \"\";\n\nconst rule = (color) =>\n `<span style=\"flex:1;min-width:0;align-self:center;height:0;border-top:3px double ${color};\"></span>`;\n\n// inline-flex keeps it on the timestamp's line; the constant 15ch reservation\n// matches the skill replacement rows so balance + skill lines align.\nconst html =\n `<span style=\"display:inline-flex;align-items:center;width:calc(100% - 15ch);gap:.75ch;overflow:hidden;vertical-align:middle;\">` +\n rule(\"#00ccff\") +\n `<span style=\"flex:0 0 auto;white-space:nowrap;\">` +\n `<span style=\"color:#00ccff;\">EQUILIBRIUM</span>` +\n (label ? ` <span style=\"color:#33cc33;\">${label}</span>` : ``) +\n `</span>` +\n rule(\"#33cc33\") +\n `</span>`;\n\nnexSys.api.line.replaceHTML(html);\n"
78
+ }
79
+ ],
80
+ "text": "You have recovered equilibrium.",
81
+ "matching": "exact",
82
+ "whole_words": true,
83
+ "case_sensitive": true
84
+ }
85
+ ]
86
+ },
87
+ {
88
+ "type": "function",
89
+ "name": "nexGui.colors",
90
+ "enabled": true,
91
+ "code": "// https://www.w3schools.com/colors/colors_names.asp\nnexGui.api.room.items.set('a monolith sigil', { text: 'A MONOLITH SIGIL', color: 'red' });\nnexGui.api.room.items.set('a granite boulder', { text: 'BOULDER!!!', color: 'tomato' });\n"
92
+ },
93
+ {
94
+ "type": "trigger",
95
+ "name": "",
96
+ "enabled": true,
97
+ "actions": [
98
+ {
99
+ "type": "script",
100
+ "enabled": true,
101
+ "script": "//nexSys.replaceHTML(`<span>The ${nexGui.iconHTML('fish-fins', ['khaki', 'orange'], 16)} appear to be plentiful here.`);\n//console.log(args[0]);\n//console.log('You bleed line -1:', nexusclient.current_block[nexusclient.current_line.index -1].line)\n\nif (nexusclient.current_line.index > 0) {\n nexusclient.current_block[nexusclient.current_line.index -1].gag = true;\n}\nnexSys.api.line.replaceHTML(args[0].replaceAll('bleed', nexGui.api.colors.iconHtml('droplet', ['red', 'silver'], 16)))\n"
102
+ }
103
+ ],
104
+ "text": "^You bleed \\d+ health\\.$",
105
+ "matching": "regexp",
106
+ "whole_words": true,
107
+ "case_sensitive": true
108
+ }
109
+ ]
110
+ },
111
+ {
112
+ "type": "group",
113
+ "name": "nexGui.party",
114
+ "enabled": true,
115
+ "actions": [],
116
+ "items": [
117
+ {
118
+ "type": "trigger",
119
+ "name": "Party Aff call 1",
120
+ "enabled": true,
121
+ "actions": [
122
+ {
123
+ "type": "script",
124
+ "enabled": true,
125
+ "script": "//(Party): Dalran says, \"Paralysis on Dunn.\"\nif (!nexGui.state.party.settings.affCalls || !nexGui.api.party.isMember(args[1])) {\n return;\n}\n\n//GMCP safeguard\nif (GMCP.Comm.Channel.Text.talker !== args[1]) {\n return;\n}\n\n// This triggers an event in my personal affliction tracking system. Left in place as\n// an example of how it might be used.\nif (GMCP.Target === args[3]) {\n /*eventStream.raiseEvent(`${args[2]}GotInsightAff`);*/\n}"
126
+ }
127
+ ],
128
+ "text": "^\\(Party\\): (\\w+) says, \"(\\w+) on (\\w+)\\.\"$",
129
+ "matching": "regexp",
130
+ "whole_words": true,
131
+ "case_sensitive": true
132
+ },
133
+ {
134
+ "type": "trigger",
135
+ "name": "Party Aff call 2",
136
+ "enabled": true,
137
+ "actions": [
138
+ {
139
+ "type": "script",
140
+ "enabled": true,
141
+ "script": "//(Party): Fieth says, \"Vanessa: Asthma.\"\nif (!nexGui.state.party.settings.affCalls || !nexGui.api.party.isMember(args[1])) {\n return;\n}\n\n//GMCP safeguard\nif (GMCP.Comm.Channel.Text.talker !== args[1]) {\n return;\n}\n\n// This triggers an event in my personal affliction tracking system. Left in place as\n// an example of how it might be used.\nif (GMCP.Target === args[2])\n eventStream.raiseEvent(`${args[3]}GotInsightAff`);"
142
+ }
143
+ ],
144
+ "text": "^\\(Party\\): (\\w+) says, \"(\\w+): (\\w+)\\.\"$",
145
+ "matching": "regexp",
146
+ "whole_words": true,
147
+ "case_sensitive": true
148
+ },
149
+ {
150
+ "type": "trigger",
151
+ "name": "Party Target 1",
152
+ "enabled": true,
153
+ "actions": [
154
+ {
155
+ "type": "script",
156
+ "enabled": true,
157
+ "script": "//GMCP safeguard\nif (GMCP.Comm.Channel.Text.talker !== args[1]) {\n return;\n}\n\nconst id = args[2].charAt(0).toUpperCase() + args[2].slice(1);\nif (\n nexGui.state.party.settings.targetCalls && \n args[1] === nexGui.state.party.leader && \n nexGui.api.players.get(GMCP.Char.Status.name).city !== nexGui.api.players.get(id)?.city\n) {\n nexusclient.send_commands(`settarget ${args[2]}`);\n nexusclient.send_commands(`enemy ${args[2]}`);\n}"
158
+ }
159
+ ],
160
+ "text": "^\\(Party\\): (\\w+) says, \"Target: (.+)\\.\"$",
161
+ "matching": "regexp",
162
+ "whole_words": true,
163
+ "case_sensitive": true
164
+ },
165
+ {
166
+ "type": "trigger",
167
+ "name": "Party Target 2",
168
+ "enabled": true,
169
+ "actions": [
170
+ {
171
+ "type": "script",
172
+ "enabled": true,
173
+ "script": "//GMCP safeguard\nif (GMCP.Comm.Channel.Text.talker !== args[1]) {\n return;\n}\n\nconst id = args[2].charAt(0).toUpperCase() + args[2].slice(1);\nif (\n nexGui.state.party.settings.targetCalls && \n args[1] === nexGui.state.party.leader && \n nexGui.api.players.get(GMCP.Char.Status.name).city !== nexGui.api.players.get(id)?.city\n) {\n nexusclient.send_commands(`settarget ${args[2]}`);\n nexusclient.send_commands(`enemy ${args[2]}`);\n}"
174
+ }
175
+ ],
176
+ "text": "^\\(Party\\): (\\w+) says, \"(?:Target|TARGET) (.+)\\.\"$",
177
+ "matching": "regexp",
178
+ "whole_words": true,
179
+ "case_sensitive": true
180
+ },
181
+ {
182
+ "type": "trigger",
183
+ "name": "Party Enemy",
184
+ "enabled": true,
185
+ "actions": [
186
+ {
187
+ "type": "script",
188
+ "enabled": true,
189
+ "script": "//GMCP safeguard\nif (GMCP.Comm.Channel.Text.talker !== args[1]) {\n return;\n}\n\n//(Party): Dunn says, \"Enemy Auri.\"\nif (nexGui.state.party.settings.targetCalls && args[1] === nexGui.state.party.leader) {\n nexusclient.send_commands(`enemy ${args[2]}`);\n}"
190
+ }
191
+ ],
192
+ "text": "^\\(Party\\): (\\w+) says, \"Enemy (.+)\\.\"$",
193
+ "matching": "regexp",
194
+ "whole_words": true,
195
+ "case_sensitive": true
196
+ },
197
+ {
198
+ "type": "trigger",
199
+ "name": "Party Follow",
200
+ "enabled": true,
201
+ "actions": [
202
+ {
203
+ "type": "script",
204
+ "enabled": true,
205
+ "script": "if (nexGui.api.party.isMember(args[1])) {\n\tnexusclient.send_commands(`follow ${args[1]}`);\n}"
206
+ }
207
+ ],
208
+ "text": "^(\\w+) makes a beckoning motion\\.$",
209
+ "matching": "regexp",
210
+ "whole_words": true,
211
+ "case_sensitive": true
212
+ },
213
+ {
214
+ "type": "trigger",
215
+ "name": "Party Block",
216
+ "enabled": true,
217
+ "actions": [
218
+ {
219
+ "type": "script",
220
+ "enabled": true,
221
+ "script": "//GMCP safeguard\nif (GMCP.Comm.Channel.Text.talker !== args[1]) {\n return;\n}\n\nconst validBlocks = [\"n\", \"e\", \"s\", \"w\", \"ne\", \"se\", \"sw\", \"nw\", \"d\", \"u\", \"down\", \"up\", \"north\", \"east\", \"south\", \"west\", \"northeast\", \"southeast\", \"southwest\", \"northwest\", \"in\", \"out\"];\n\nif (validBlocks.includes(args[1].toLowerCase())) {\n nexusclient.send_commands(`block ${args[1]}`);\n}"
222
+ }
223
+ ],
224
+ "text": "^\\(Party\\): \\w+ says, \"Block (\\w+).\"$",
225
+ "matching": "regexp",
226
+ "whole_words": true,
227
+ "case_sensitive": true
228
+ },
229
+ {
230
+ "type": "trigger",
231
+ "name": "Party Unblock",
232
+ "enabled": true,
233
+ "actions": [
234
+ {
235
+ "type": "script",
236
+ "enabled": true,
237
+ "script": "//GMCP safeguard\nif (GMCP.Comm.Channel.Text.talker !== args[1]) {\n return;\n}\n\nnexusclient.send_commands('unblock');"
238
+ }
239
+ ],
240
+ "text": "^\\(Party\\): \\w+ says, \"Unblock\\.\"$",
241
+ "matching": "regexp",
242
+ "whole_words": true,
243
+ "case_sensitive": true
244
+ },
245
+ {
246
+ "type": "trigger",
247
+ "name": "",
248
+ "enabled": true,
249
+ "actions": [
250
+ {
251
+ "type": "script",
252
+ "enabled": true,
253
+ "script": "nexSys.api.defs.setDefaultPriority('blocking', 0);"
254
+ }
255
+ ],
256
+ "text": "Block is not a valid command.",
257
+ "matching": "exact",
258
+ "whole_words": true,
259
+ "case_sensitive": true
260
+ },
261
+ {
262
+ "type": "trigger",
263
+ "name": "",
264
+ "enabled": true,
265
+ "actions": [
266
+ {
267
+ "type": "script",
268
+ "enabled": true,
269
+ "script": "nexSys.api.defs.setDefaultPriority('blocking', 0);"
270
+ }
271
+ ],
272
+ "text": "You need to be mounted to block.",
273
+ "matching": "regexp",
274
+ "whole_words": true,
275
+ "case_sensitive": true
276
+ },
277
+ {
278
+ "type": "trigger",
279
+ "name": "",
280
+ "enabled": true,
281
+ "actions": [
282
+ {
283
+ "type": "script",
284
+ "enabled": true,
285
+ "script": "nexSys.api.defs.setDefaultPriority('blocking', 0);"
286
+ }
287
+ ],
288
+ "text": "There is no exit to block that way.",
289
+ "matching": "regexp",
290
+ "whole_words": true,
291
+ "case_sensitive": true
292
+ }
293
+ ]
294
+ },
295
+ {
296
+ "type": "group",
297
+ "name": "nexGui.timer",
298
+ "enabled": true,
299
+ "actions": [],
300
+ "items": [
301
+ {
302
+ "type": "trigger",
303
+ "name": "",
304
+ "enabled": true,
305
+ "actions": [
306
+ {
307
+ "type": "script",
308
+ "enabled": true,
309
+ "script": "// Example of how to start timers.\nnexGui.api.timers.start('tree')"
310
+ }
311
+ ],
312
+ "text": "^You touch the tree of life tattoo\\.$",
313
+ "matching": "regexp",
314
+ "whole_words": true,
315
+ "case_sensitive": true
316
+ }
317
+ ]
318
+ },
319
+ {
320
+ "type": "group",
321
+ "name": "nexGui.msg",
322
+ "enabled": true,
323
+ "actions": [],
324
+ "items": [
325
+ {
326
+ "type": "trigger",
327
+ "name": "Smiley face gag",
328
+ "enabled": true,
329
+ "actions": [
330
+ {
331
+ "type": "script",
332
+ "enabled": true,
333
+ "script": "for(let i = 0; i < nexusclient.current_block.length; i++) {\n\tif (!nexusclient.current_line.is_prompt) {\n\t\tnexusclient.current_block[i].gag = true;\n }\n}"
334
+ }
335
+ ],
336
+ "text": " ..o@@@@@@@@@@@@@o..",
337
+ "matching": "exact",
338
+ "whole_words": true,
339
+ "case_sensitive": true
340
+ },
341
+ {
342
+ "type": "trigger",
343
+ "name": "AlertnessHere",
344
+ "enabled": true,
345
+ "actions": [
346
+ {
347
+ "type": "script",
348
+ "enabled": true,
349
+ "script": "const players = [args[1]];\nconst re = /^Your enhanced senses inform you that (\\w+) has entered .+ at your location\\.$/;\nconst index = nexusclient.current_block.findIndex(e => e === nexusclient.current_line);\nconst testBlock = () => {\n for (let i = index + 1; i < nexusclient.current_block.length - 1; i++) {\n const txt = nexusclient.current_block[i].parsed_line?.text();\n const match = txt.match(re);\n if (match) {\n players.push(match[1]);\n\t nexusclient.current_block[i].gag = true;\n }\n }\n\n}\ntestBlock();\nconsole.log(nexusclient.current_block);\n\nconst line = document.createElement('span');\n\nconst left = document.createElement('span');\nleft.textContent = \"[\";\nleft.style.color = \"red\";\nline.appendChild(left);\n\nplayers.forEach(p => {\n const player = document.createElement('span');\n player.textContent = `${p} `;\n player.style.color = nexGui.api.colors.playerColor(p);\n line.appendChild(player);\n})\n\nconst dir = document.createElement('span');\ndir.textContent = \"- Here\";\ndir.style.color = 'white';\nline.appendChild(dir);\n\nconst right = document.createElement('span');\nright.textContent = \"]\";\nright.style.color = \"red\";\nline.appendChild(right);\n\nnexSys.api.line.replaceHTML(line.outerHTML);"
350
+ }
351
+ ],
352
+ "text": "^Your enhanced senses inform you that (\\w+) has entered .+ at your location\\.$",
353
+ "matching": "regexp",
354
+ "whole_words": true,
355
+ "case_sensitive": true
356
+ },
357
+ {
358
+ "type": "trigger",
359
+ "name": "AlertnessThere",
360
+ "enabled": true,
361
+ "actions": [
362
+ {
363
+ "type": "script",
364
+ "enabled": true,
365
+ "script": "const players = [args[1]];\nconst re = /^Your enhanced senses inform you that (\\w+) has entered .+, to the (\\w+)\\.$/;\nconst index = nexusclient.current_block.findIndex(e => e === nexusclient.current_line);\n\nconst testBlock = () => {\n for (let i = index + 1; i < nexusclient.current_block.length - 1; i++) {\n const txt = nexusclient.current_block[i].parsed_line?.text();\n const match = txt.match(re);\n if (match) {\n players.push(match[1]);\n\t nexusclient.current_block[i].gag = true;\n }\n }\n\n}\ntestBlock();\nconsole.log(nexusclient.current_block);\n\nconst line = document.createElement('span');\n\nconst left = document.createElement('span');\nleft.textContent = \"[\";\nleft.style.color = \"red\";\nline.appendChild(left);\n\nplayers.forEach(p => {\n const player = document.createElement('span');\n player.textContent = `${p} `;\n player.style.color = nexGui.api.colors.playerColor(p);\n line.appendChild(player);\n})\n\nconst dir = document.createElement('span');\ndir.textContent = `- ${args[2].capitalize()}`;\ndir.style.color = 'cyan';\nline.appendChild(dir);\n\nconst right = document.createElement('span');\nright.textContent = \"]\";\nright.style.color = \"red\";\nline.appendChild(right);\n\nnexSys.api.line.replaceHTML(line.outerHTML);\n"
366
+ }
367
+ ],
368
+ "text": "^Your enhanced senses inform you that (\\w+) has entered .+, to the (\\w+)\\.$",
369
+ "matching": "regexp",
370
+ "whole_words": true,
371
+ "case_sensitive": true
372
+ },
373
+ {
374
+ "type": "trigger",
375
+ "name": "",
376
+ "enabled": true,
377
+ "actions": [],
378
+ "text": "^(\\w+) wanders into view directly below\\.$",
379
+ "matching": "regexp",
380
+ "whole_words": true,
381
+ "case_sensitive": true
382
+ },
383
+ {
384
+ "type": "trigger",
385
+ "name": "",
386
+ "enabled": true,
387
+ "actions": [],
388
+ "text": "^(\\w+) wanders out of sight from below you\\.$",
389
+ "matching": "regexp",
390
+ "whole_words": true,
391
+ "case_sensitive": true
392
+ },
393
+ {
394
+ "type": "trigger",
395
+ "name": "",
396
+ "enabled": true,
397
+ "actions": [],
398
+ "text": "^(\\w+) flies away to the beyond\\.$",
399
+ "matching": "regexp",
400
+ "whole_words": true,
401
+ "case_sensitive": true
402
+ },
403
+ {
404
+ "type": "trigger",
405
+ "name": "",
406
+ "enabled": true,
407
+ "actions": [],
408
+ "text": "^(\\w+) flits into view directly overhead\\.$",
409
+ "matching": "regexp",
410
+ "whole_words": true,
411
+ "case_sensitive": true
412
+ }
413
+ ]
414
+ },
415
+ {
416
+ "type": "group",
417
+ "name": "nexGui.stream",
418
+ "enabled": true,
419
+ "actions": [],
420
+ "items": [
421
+ {
422
+ "type": "trigger",
423
+ "name": "",
424
+ "enabled": true,
425
+ "actions": [
426
+ {
427
+ "type": "script",
428
+ "enabled": true,
429
+ "script": "// This block gags all of the curing text that follows the [Curing] msg.\n// things like sipping the health vial. Only the [Curing] (text). is displayed.\nnexusclient.current_line.parsed_line.chunks[nexusclient.current_line.parsed_line.chunks.length-1]._txt = nexusclient.current_line.parsed_line.chunks[nexusclient.current_line.parsed_line.chunks.length-1]._txt.toLowerCase();\n\nconst index = nexusclient.current_line.index;\nfor(let i = index + 1; i < index + 3 && i < nexusclient.current_block.length; i++) {\n\tif (nexusclient.current_block[i].is_prompt) {\n break;\n }\n if (nexusclient.current_block[i].line) {\n nexusclient.current_block[i].gag = true;\n nexusclient.current_block[i].log = true;\n }\n}\n\nif (args[1] === 'CLOT') {\n /*clotCount++;\n if (clotCount > 1) {\n nexGui.stream.system.revise([\n `<span style=\"color: #800000; \">[Curing]:</span>`,\n `<span style=\"color: #aaaaaa\" class=\"nexGui-Clot\">Clot x${clotCount}</span>`\n ]);\n } else {\n nexGui.api.stream.add({\n html: `<span style=\"color: #800000; \">[Curing]: </span><span style=\"color: #aaaaaa\" class=\"nexGui-Clot\">Clot</span>`,\n stream: \"system\",\n });\n \tnexGui.stream.system.add([\n `<span style=\"color: #800000; \">[Curing]:</span>`,\n `<span style=\"color: #aaaaaa\" class=\"nexGui-Clot\">Clot</span>`\n ]);\n }*/\n} else {\n clotCount = 0;\n nexGui.api.stream.add({\n html: `<span style='color:#800000'>[Curing]: </span><span class='mono'>${args[1]}</span>`,\n stream: \"system\",\n });\n //nexGui.stream.system.add([`<span style='color:#800000'>[Curing]:</span>`,`<span class='mono'>${args[1].toProperCase()}</span>`]);\n}\n\nnexusclient.current_line.gag = true;\nnexusclient.current_line.log = true;"
430
+ }
431
+ ],
432
+ "text": "^\\[Curing\\]: (.+)$",
433
+ "matching": "regexp",
434
+ "whole_words": true,
435
+ "case_sensitive": true
436
+ },
437
+ {
438
+ "type": "trigger",
439
+ "name": "",
440
+ "enabled": false,
441
+ "actions": [
442
+ {
443
+ "type": "script",
444
+ "enabled": true,
445
+ "script": "nexGui.stream.system.add([`<span style=\"color:deepskyblue\">[Prio] ${args[2]}</span>`,`<span>${args[1].toProperCase()}</span>`]);"
446
+ }
447
+ ],
448
+ "text": "^You have set the \\'(\\w+)\\' defence to the (\\d+) priority\\.$",
449
+ "matching": "regexp",
450
+ "whole_words": true,
451
+ "case_sensitive": true
452
+ },
453
+ {
454
+ "type": "trigger",
455
+ "name": "",
456
+ "enabled": false,
457
+ "actions": [
458
+ {
459
+ "type": "script",
460
+ "enabled": true,
461
+ "script": "nexGui.stream.system.add([\n `<span style=\"color:deepskyblue\">[Prio] ${args[2]}</span>`,\n `<span>${args[1].toProperCase()}</span>`\n ]);"
462
+ }
463
+ ],
464
+ "text": "^You have set the \\'(\\w+)\\' affliction to the (\\d+) priority\\.$",
465
+ "matching": "regexp",
466
+ "whole_words": true,
467
+ "case_sensitive": true
468
+ },
469
+ {
470
+ "type": "trigger",
471
+ "name": "",
472
+ "enabled": false,
473
+ "actions": [
474
+ {
475
+ "type": "script",
476
+ "enabled": true,
477
+ "script": "nexGui.stream.combat.add([\n `<span style=\"color:red\">[Target]</span>`,\n `<span class=\"mono\">${GMCP.IRE.Target.Info.short_desc}</span>`\n ]);"
478
+ }
479
+ ],
480
+ "text": "^Your target is now: (.+)$",
481
+ "matching": "regexp",
482
+ "whole_words": true,
483
+ "case_sensitive": true
484
+ }
485
+ ]
486
+ },
487
+ {
488
+ "type": "group",
489
+ "name": "nexGui.who",
490
+ "enabled": true,
491
+ "items": [
492
+ {
493
+ "type": "alias",
494
+ "name": "",
495
+ "enabled": true,
496
+ "actions": [
497
+ {
498
+ "type": "script",
499
+ "enabled": true,
500
+ "script": "nexAction.triggers.enable(\"nexGui4.who.quickWhoCapture\");\nnexusclient.send_commands(\"qwc\");"
501
+ }
502
+ ],
503
+ "text": "qw",
504
+ "matching": "exact",
505
+ "whole_words": true,
506
+ "case_sensitive": true,
507
+ "prefix_suffix": true
508
+ },
509
+ {
510
+ "type": "alias",
511
+ "name": "",
512
+ "enabled": true,
513
+ "actions": [
514
+ {
515
+ "type": "script",
516
+ "enabled": true,
517
+ "script": "nexAction.triggers.enable(\"nexGui4.who.quickWhoCapture\");\nnexusclient.send_commands(\"qwc\");"
518
+ }
519
+ ],
520
+ "text": "qwl",
521
+ "matching": "exact",
522
+ "whole_words": true,
523
+ "case_sensitive": true,
524
+ "prefix_suffix": true
525
+ },
526
+ {
527
+ "type": "alias",
528
+ "name": "",
529
+ "enabled": true,
530
+ "actions": [
531
+ {
532
+ "type": "script",
533
+ "enabled": true,
534
+ "script": "//TODO\n//nexusclient.reflexes().enable_reflex(nexusclient.reflexes().find_by_name(\"group\", \"nexGui.who.capture\", true, false, \"nexGui4\"));\nnexusclient.send_commands('who brief');"
535
+ }
536
+ ],
537
+ "text": "qwb",
538
+ "matching": "exact",
539
+ "whole_words": true,
540
+ "case_sensitive": true,
541
+ "prefix_suffix": true
542
+ },
543
+ {
544
+ "type": "alias",
545
+ "name": "",
546
+ "enabled": true,
547
+ "actions": [
548
+ {
549
+ "type": "script",
550
+ "enabled": true,
551
+ "script": "//TODO\n//nexusclient.reflexes().enable_reflex(nexusclient.reflexes().find_by_name(\"group\", \"nexGui.who.capture\", true, false, \"nexGui4\"));\nnexusclient.send_commands('who brief');"
552
+ }
553
+ ],
554
+ "text": "qwhom",
555
+ "matching": "exact",
556
+ "whole_words": true,
557
+ "case_sensitive": true,
558
+ "prefix_suffix": true
559
+ },
560
+ {
561
+ "type": "trigger",
562
+ "name": "qw capture",
563
+ "enabled": false,
564
+ "actions": [
565
+ {
566
+ "type": "script",
567
+ "enabled": true,
568
+ "script": "// nexGui4 — Quick Who City capture\n\n// Server QWC name colors (the colors Achaea sends in the qwc block) → city key.\nconst nexusColors = {\n \"#800080\": \"ashtan\",\n \"#008080\": \"cyrene\",\n \"#00ff00\": \"eleusis\",\n \"#808000\": \"hashan\",\n \"#ff0000\": \"mhaldor\",\n \"#ffffff\": \"targossas\",\n \"#c0c0c0\": \"(none)\",\n \"#008000\": \"garden\",\n \"#ffff00\": \"garden\",\n};\n// Gag the raw server block; nexGui re-renders it with its own city colors.\nnexusclient.current_block.forEach((b) => (b.gag = true));\n\nconst qwcList = [];\n\nnexusclient.current_block[0].parsed_line.chunks.forEach((e) => {\n if (!e._txt || !e._color) return;\n\n const name = e._txt;\n qwcList.push(name); // collect for formatting\n\n const profile = nexGui.api.players.get(name); // frozen snapshot or null\n const gameCity = nexusColors[e._color.toLowerCase()];\n\n if (!profile) {\n // nexGui has never seen this character.\n nexGui.api.display.notice(`nexGui: directory entry missing for ${name}`);\n console.log(`nexGui: directory entry missing for ${name}`);\n return;\n }\n\n // Genuine city change: the live QWC color disagrees with the cached city.\n if (gameCity && profile.city !== gameCity) {\n nexGui.api.display.notice(\n `City mismatch: ${name} game: ${gameCity}, nexGui: ${profile.city}`,\n );\n console.log(`City mismatch: ${name} game: ${gameCity}, nexGui: ${profile.city}`);\n\n // The directory is authoritative and read-only to scripts — don't mutate\n // the cache by hand. Force a refresh from the public API instead; this\n // re-pulls the profile and updates the directory + crowdsource cache.\n nexGui.api.players.fetch(name).catch(() => {});\n }\n});\n\nnexGui.api.players.qwFormat(qwcList);\n\n// One-shot: re-disable this capture trigger until the next qwc is sent.\nnexusclient\n .reflexes()\n .disable_reflex(\n nexusclient.reflexes().find_by_name(\"trigger\", \"qw capture\", true, false, \"nexGui4\"),\n );"
569
+ }
570
+ ],
571
+ "text": "^.*\\(\\d+ total\\)\\.$",
572
+ "matching": "regexp",
573
+ "whole_words": true,
574
+ "case_sensitive": true
575
+ },
576
+ {
577
+ "type": "group",
578
+ "name": "nexGui.who.capture",
579
+ "enabled": false,
580
+ "items": [
581
+ {
582
+ "type": "trigger",
583
+ "name": "",
584
+ "enabled": true,
585
+ "actions": [
586
+ {
587
+ "type": "script",
588
+ "enabled": true,
589
+ "script": "nexusclient.current_line.gag = true;\nnexGui.cdb.qwbCapture(args[1], args[2]);"
590
+ }
591
+ ],
592
+ "text": "^(\\w+)\\s+\\((.+)\\)$",
593
+ "matching": "regexp",
594
+ "whole_words": true,
595
+ "case_sensitive": true
596
+ },
597
+ {
598
+ "type": "trigger",
599
+ "name": "",
600
+ "enabled": true,
601
+ "actions": [
602
+ {
603
+ "type": "script",
604
+ "enabled": true,
605
+ "script": "nexusclient.current_line.gag = true;\nnexGui.cdb.qwbCapture(args[1], 'unknown');\nreturn;\nlet area = { name: 'unknown' };\nif (typeof nexWho.capturedAreas[area.name] === 'undefined') {\n nexWho.capturedAreas[area.name] = {}\n nexWho.capturedAreas[area.name]['Embracing Death'] = [args[1]];\n} else if (typeof nexWho.capturedAreas[area.name]['Embracing Death'] === 'undefined') {\n nexWho.capturedAreas[area.name]['Embracing Death'] = [args[1]];\n} else {\n nexWho.capturedAreas[area.name]['Embracing Death'].push(args[1]);\n}"
606
+ }
607
+ ],
608
+ "text": "^\\(Embracing Death\\)\\s+(\\w+)\\.$",
609
+ "matching": "regexp",
610
+ "whole_words": true,
611
+ "case_sensitive": true
612
+ },
613
+ {
614
+ "type": "trigger",
615
+ "name": "",
616
+ "enabled": true,
617
+ "actions": [
618
+ {
619
+ "type": "script",
620
+ "enabled": true,
621
+ "script": "nexusclient.current_line.gag = true;\nnexGui.cdb.qwbCapture(`Soul ${args[1]}`, args[2]);\nreturn;\nlet area = nexWho.mudmap.areas.find(a => a.rooms.find(r => r.name?.indexOf(args[2]) === 0));\nif (typeof area === 'undefined') { area = { name: 'unknown' }; }\nif (typeof nexWho.capturedAreas[area.name] === 'undefined') {\n nexWho.capturedAreas[area.name] = {}\n nexWho.capturedAreas[area.name][args[2]] = [`Soul ${args[1]}`];\n} else if (typeof nexWho.capturedAreas[area.name][args[2]] === 'undefined') {\n nexWho.capturedAreas[area.name][args[2]] = [`Soul ${args[1]}`];\n} else {\n nexWho.capturedAreas[area.name][args[2]].push(`Soul ${args[1]}`);\n}"
622
+ }
623
+ ],
624
+ "text": "^The soul of (\\w+)\\s+\\((.+)\\)$",
625
+ "matching": "regexp",
626
+ "whole_words": true,
627
+ "case_sensitive": true
628
+ },
629
+ {
630
+ "type": "trigger",
631
+ "name": "",
632
+ "enabled": true,
633
+ "actions": [
634
+ {
635
+ "type": "script",
636
+ "enabled": true,
637
+ "script": "nexusclient.current_line.gag = true;"
638
+ }
639
+ ],
640
+ "text": "^(\\w+)$",
641
+ "matching": "regexp",
642
+ "whole_words": true,
643
+ "case_sensitive": true
644
+ },
645
+ {
646
+ "type": "trigger",
647
+ "name": "",
648
+ "enabled": true,
649
+ "actions": [
650
+ {
651
+ "type": "script",
652
+ "enabled": true,
653
+ "script": "nexusclient.current_line.gag = true;\nnexusclient.send_commands('more');"
654
+ }
655
+ ],
656
+ "text": "^\\[Type MORE if you wish to continue reading\\. \\((\\d+)% shown\\)\\]$",
657
+ "matching": "regexp",
658
+ "whole_words": true,
659
+ "case_sensitive": true
660
+ },
661
+ {
662
+ "type": "trigger",
663
+ "name": "",
664
+ "enabled": true,
665
+ "actions": [
666
+ {
667
+ "type": "script",
668
+ "enabled": true,
669
+ "script": "nexusclient.current_line.gag = true;"
670
+ }
671
+ ],
672
+ "text": "^\\[File continued via MORE\\]$",
673
+ "matching": "regexp",
674
+ "whole_words": true,
675
+ "case_sensitive": true
676
+ },
677
+ {
678
+ "type": "trigger",
679
+ "name": "",
680
+ "enabled": true,
681
+ "actions": [
682
+ {
683
+ "type": "script",
684
+ "enabled": true,
685
+ "script": "nexusclient.current_line.gag = true;\n\nnexGui.cdb.qwbDisplay();\n\nnexusclient.reflexes().disable_reflex(nexusclient.reflexes().find_by_name(\"group\", \"nexGui.who.capture\", true, false, \"nexGui4\"));"
686
+ }
687
+ ],
688
+ "text": "^Total: (\\d+)$",
689
+ "matching": "regexp",
690
+ "whole_words": true,
691
+ "case_sensitive": true
692
+ }
693
+ ]
694
+ }
695
+ ]
696
+ },
697
+ {
698
+ "type": "group",
699
+ "name": "nexGui.classCustomizations",
700
+ "enabled": true,
701
+ "actions": [],
702
+ "items": [
703
+ {
704
+ "type": "function",
705
+ "name": "nexGui.occultist",
706
+ "enabled": true,
707
+ "code": "// nexSys is a dependency for some of these checks.\n// The code is still useful for examples on user customizations.\nif (typeof nexSys === \"undefined\") { return; }\n\n/*\n This is the GMCP property for your class balance.\n This will control the state of the class balance icon which is added as\n an hourglass on the footer.\n*/\nnexGui.api.customize.classBalance.set('Entity');\n\n/*\n Populates the nexGui defence array with defences from nexSys\n for your class which you have set a priority for.\n*/\nconst defs = Object.values(nexSys.state.defs).filter(d => d.priority > 0 && d.skills.includes(nexSys.state.class)).map(d => d.id);\nnexGui.api.customize.defences.set(defs);\n\n// Update this to match whatever tattoos you like to maintain\nnexGui.api.customize.defences.set([\n ...nexGui.state.customize.defences,\n 'oxtattoo', 'boartattoo', 'megalithtattoo', 'chameleon', 'starburst', 'mosstattoo', 'grookbubble', 'nicatorlegend', 'astronomy',\n]);\n\n// Clear only the timers belonging to this class, identified by groupId.\n// Using .clear() with no argument removes ALL timers — a clean slate. May or may not be desired.\n// nexGui.api.timers.clear();\nnexGui.api.timers.clear('myClass');\n\n// Add timers starting from the top.\n// nexGui.api.timers.add(id, durationMs, label, options)\n// durationMs is in milliseconds. direction: 'countup' counts up from zero, 'countdown' counts down to zero.\n// Assigning a groupId ties these timers to this class — nexGui.api.timers.clear('myClass') removes only these.\nnexGui.api.timers.add('tree', 15000, 'Tree Tattoo', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('fool', 35000, 'Fool', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('sunTick', 25000, 'Sun Tick', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('crystaltattoo', 3600000, 'Crystal Tattoo', { direction: 'countup', groupId: 'myClass' });\n\n// Add timers starting from the bottom.\nnexGui.api.timers.add('tentacles', 45000, 'Tentacles', { direction: 'countdown', stayVisible: false, position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('arctar', 45000, 'Arctar Orb', { direction: 'countdown', stayVisible: false, position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('sunOrb', 180000, 'Sun Orb', { direction: 'countdown', stayVisible: false, position: 'bottom', groupId: 'myClass' });\n"
708
+ },
709
+ {
710
+ "type": "function",
711
+ "name": "nexGui.magi",
712
+ "enabled": true,
713
+ "code": "// nexSys is a dependency for some of these checks\nif (typeof nexSys === \"undefined\") { return; }\n\nconst defs = Object.values(nexSys.state.defs).filter(d => d.priority > 0 && d.skills.includes(nexSys.state.class)).map(d => d.id);\nnexGui.api.customize.defences.set(defs);\n\n// Update this to match whatever tattoos you like to maintain\nnexGui.api.customize.defences.set([\n ...nexGui.state.customize.defences,\n 'oxtattoo', 'boartattoo', 'megalithtattoo', 'chameleon', 'starburst', 'mosstattoo', 'grookbubble', 'nicatorlegend', 'astronomy',\n 'stonefist', 'stoneskin', 'diamondskin', 'chargeshield'\n]);\n\n// Clear existing timers\nnexGui.api.timers.clear('myClass');\n\n// Timers at the top of panel\nnexGui.api.timers.add('tree', 15000, 'Tree Tattoo', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('crystaltattoo', 3600000, 'Crystal Tattoo', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('vibes', 2400000, 'Vibes', { direction: 'countdown', groupId: 'myClass' });\n// Timers at the bottom of panel\nnexGui.api.timers.add('stormbolt', 27000, 'Stormbolt', { direction: 'countup', position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('dilation', 35000, 'Dilation', { direction: 'countup', position: 'bottom', groupId: 'myClass' });"
714
+ },
715
+ {
716
+ "type": "function",
717
+ "name": "nexGui.runewarden",
718
+ "enabled": true,
719
+ "code": "// nexSys is a dependency for some of these checks. \n//The code is still useful for examples on User customizations.\nif (typeof nexSys === \"undefined\") { return; }\n"
720
+ },
721
+ {
722
+ "type": "function",
723
+ "name": "nexGui.reddragon",
724
+ "enabled": true,
725
+ "code": "// nexSys is a dependency for some of these checks\nif (typeof nexSys === \"undefined\") { return; }\n\nconst defs = Object.values(nexSys.state.defs).filter(d => d.priority > 0 && d.skills.includes(nexSys.state.class)).map(d => d.id);\nnexGui.api.customize.defences.set(defs);\n\n// Update this to match whatever tattoos you like to maintain\nnexGui.api.customize.defences.set([\n ...nexGui.state.customize.defences,\n 'oxtattoo', 'boartattoo', 'megalithtattoo', 'chameleon', 'starburst', 'mosstattoo', 'grookbubble', 'nicatorlegend', 'astronomy',\n]);\n\n// Clear existing timers\nnexGui.api.timers.clear('myClass');\n\n// Timers at the top of panel\nnexGui.api.timers.add('tree', 15000, 'Tree Tattoo', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('dragonheal', 20000, 'Dragon Heal', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('crystaltattoo', 3600000, 'Crystal Tattoo', { direction: 'countup', groupId: 'myClass' });\n// Timers at the bottom of panel\nnexGui.api.timers.add('dragontaunt', 19000, 'Dragontaunt', { direction: 'countup', position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('scorch', 25000, 'Scorch', { direction: 'countup', position: 'bottom', groupId: 'myClass' });"
726
+ },
727
+ {
728
+ "type": "function",
729
+ "name": "nexGui.bluedragon",
730
+ "enabled": true,
731
+ "code": "// nexSys is a dependency for some of these checks\nif (typeof nexSys === \"undefined\") { return; }\n\n// All defenses that have a priority set by default\nconst defs = Object.values(nexSys.state.defs).filter(d => d.priority > 0 && d.skills.includes(nexSys.state.class)).map(d => d.id);\nnexGui.api.customize.defences.set(defs);\n\n// Update this to match whatever tattoos you like to maintain\nnexGui.api.customize.defences.set([\n ...nexGui.state.customize.defences,\n 'oxtattoo', 'boartattoo', 'megalithtattoo', 'chameleon', 'starburst', 'mosstattoo', 'grookbubble', 'nicatorlegend', 'astronomy',\n]);\n\n// Clear existing timers\nnexGui.api.timers.clear('myClass');\n\n// Timers at the top of panel\nnexGui.api.timers.add('tree', 15000, 'Tree Tattoo', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('dragonheal', 20000, 'Dragon Heal', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('crystaltattoo', 3600000, 'Crystal Tattoo', { direction: 'countup', groupId: 'myClass' });\n// Timers at the bottom of panel\nnexGui.api.timers.add('dragonchill', 16000, 'Dragonchill', { direction: 'countup', position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('ague', 23000, 'Ague', { direction: 'countup', position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('glaciate', 33000, 'Glaciate', { direction: 'countup', position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('override', 23000, 'Override', { direction: 'countup', position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('frostwave', 23000, 'Frostwave', { direction: 'countup', position: 'bottom', groupId: 'myClass' });"
732
+ },
733
+ {
734
+ "type": "function",
735
+ "name": "nexGui.goldendragon",
736
+ "enabled": true,
737
+ "code": "// nexSys is a dependency for some of these checks\nif (typeof nexSys === \"undefined\") { return; }\n\n// All defenses that have a priority set by default\nconst defs = Object.values(nexSys.state.defs).filter(d => d.priority > 0 && d.skills.includes(nexSys.state.class)).map(d => d.id);\nnexGui.api.customize.defences.set(defs);\n\n// Update this to match whatever tattoos you like to maintain\nnexGui.api.customize.defences.set([\n ...nexGui.state.customize.defences,\n 'oxtattoo', 'boartattoo', 'megalithtattoo', 'chameleon', 'starburst', 'mosstattoo', 'grookbubble', 'nicatorlegend', 'astronomy',\n]);\n\n// Clear existing timers\nnexGui.api.timers.clear('myClass');\n\n// Timers at the top of panel\nnexGui.api.timers.add('tree', 15000, 'Tree Tattoo', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('dragonheal', 20000, 'Dragon Heal', { direction: 'countup', groupId: 'myClass' });\nnexGui.api.timers.add('crystaltattoo', 3600000, 'Crystal Tattoo', { direction: 'countup', groupId: 'myClass' });\n// Timers at the bottom of panel\nnexGui.api.timers.add('deaden', 35000, 'Deaden', { direction: 'countup', position: 'bottom', groupId: 'myClass' });\nnexGui.api.timers.add('psidaze', 40000, 'Psidaze', { direction: 'countup', position: 'bottom', groupId: 'myClass' });"
738
+ }
739
+ ]
740
+ },
741
+ {
742
+ "type": "group",
743
+ "name": "nexGui.userSettings",
744
+ "enabled": true,
745
+ "items": []
746
+ },
747
+ {
748
+ "type": "alias",
749
+ "name": "",
750
+ "enabled": true,
751
+ "actions": [
752
+ {
753
+ "type": "script",
754
+ "enabled": true,
755
+ "script": "const layout = {\n layout: JSON.stringify(nexusclient.ui().layout().model().layout),\n borders: JSON.stringify(nexusclient.ui().layout().model().borders),\n}\nnexusclient.variables().vars.nexGui4Layout = layout;\nnexusclient.ui().layout().model().layout = JSON.parse(\"{\\\"type\\\":\\\"row\\\",\\\"id\\\":\\\"main\\\",\\\"children\\\":[{\\\"type\\\":\\\"row\\\",\\\"id\\\":\\\"#70e4ecdf-81dc-40c6-b536-b62595eff99b\\\",\\\"weight\\\":57.26509774852639,\\\"children\\\":[{\\\"type\\\":\\\"tabset\\\",\\\"id\\\":\\\"#f85f4040-6d4a-49c7-94bd-7244f1a3b32d\\\",\\\"weight\\\":17.557736227615205,\\\"selected\\\":1,\\\"children\\\":[{\\\"type\\\":\\\"tab\\\",\\\"id\\\":\\\"map\\\",\\\"name\\\":\\\"Map\\\",\\\"helpText\\\":\\\"Map\\\",\\\"component\\\":\\\"map\\\",\\\"icon\\\":\\\"route\\\"},{\\\"type\\\":\\\"tab\\\",\\\"id\\\":\\\"nexMap\\\",\\\"name\\\":\\\"nexMap\\\",\\\"helpText\\\":\\\"nexMap\\\",\\\"component\\\":\\\"nexMap\\\",\\\"icon\\\":\\\"feather-pointed\\\"}]},{\\\"type\\\":\\\"row\\\",\\\"id\\\":\\\"#bcb4f90b-4716-4f9b-9b22-ffd8741be626\\\",\\\"weight\\\":7.090289581370549,\\\"children\\\":[{\\\"type\\\":\\\"tabset\\\",\\\"id\\\":\\\"#b54bf1ab-4145-4041-9e67-8e6b789724b1\\\",\\\"weight\\\":11.363636363636363,\\\"children\\\":[{\\\"type\\\":\\\"tab\\\",\\\"id\\\":\\\"nexPlayers\\\",\\\"name\\\":\\\"nexPlayers\\\",\\\"helpText\\\":\\\"nexPlayers\\\",\\\"component\\\":\\\"nexPlayers\\\",\\\"icon\\\":\\\"feather-pointed\\\"}]},{\\\"type\\\":\\\"tabset\\\",\\\"id\\\":\\\"#3df7c443-17f5-406e-9a45-54879deb731e\\\",\\\"weight\\\":26.79425837320574,\\\"children\\\":[{\\\"type\\\":\\\"tab\\\",\\\"id\\\":\\\"nexNpcs\\\",\\\"name\\\":\\\"nexNpcs\\\",\\\"helpText\\\":\\\"nexNpcs\\\",\\\"component\\\":\\\"nexNpcs\\\",\\\"icon\\\":\\\"feather-pointed\\\"}]},{\\\"type\\\":\\\"tabset\\\",\\\"id\\\":\\\"#5c7c36a2-9496-4e6f-a1df-c581f898f7ac\\\",\\\"weight\\\":36.8421052631579,\\\"children\\\":[{\\\"type\\\":\\\"tab\\\",\\\"id\\\":\\\"nexItems\\\",\\\"name\\\":\\\"nexItems\\\",\\\"helpText\\\":\\\"nexItems\\\",\\\"component\\\":\\\"nexItems\\\",\\\"icon\\\":\\\"feather-pointed\\\"}],\\\"active\\\":true}]},{\\\"type\\\":\\\"tabset\\\",\\\"id\\\":\\\"#1eaac23b-4eae-486d-8915-90a25f41f9e0\\\",\\\"weight\\\":2.6494514015995967,\\\"children\\\":[{\\\"type\\\":\\\"tab\\\",\\\"id\\\":\\\"all_comm\\\",\\\"name\\\":\\\"All Comm\\\",\\\"helpText\\\":\\\"Global Communication Window\\\",\\\"component\\\":\\\"all_comm\\\",\\\"icon\\\":\\\"message-lines\\\"}]},{\\\"type\\\":\\\"tabset\\\",\\\"id\\\":\\\"#fdd3f126-a4e3-4f24-9e2b-03b2f25825ec\\\",\\\"weight\\\":30.58912072755898,\\\"enableDrop\\\":false,\\\"enableTabStrip\\\":false,\\\"children\\\":[{\\\"type\\\":\\\"tab\\\",\\\"id\\\":\\\"#90968890-c02d-44ac-947a-5651201350c8\\\",\\\"component\\\":\\\"center\\\"}]}]}]}\");\n\nnexusclient.ui().layout().model().borders = JSON.parse(\n '[{\"type\":\"border\",\"size\":700,\"location\":\"right\",\"children\":[{\"type\":\"tab\",\"id\":\"nexOptions\",\"name\":\"nexOptions\",\"helpText\":\"nexOptions\",\"component\":\"nexOptions\",\"icon\":\"feather-pointed\",\"borderWidth\":300},{\"type\":\"tab\",\"id\":\"nexParty\",\"name\":\"nexParty\",\"helpText\":\"nexParty\",\"component\":\"nexParty\",\"icon\":\"feather-pointed\",\"borderWidth\":300},{\"type\":\"tab\",\"id\":\"nexMetrics\",\"name\":\"nexMetrics\",\"helpText\":\"nexMetrics\",\"component\":\"nexMetrics\",\"icon\":\"feather-pointed\"},{\"type\":\"tab\",\"id\":\"nexStats\",\"name\":\"nexStats\",\"helpText\":\"nexStats\",\"component\":\"nexStats\",\"icon\":\"feather-pointed\",\"borderWidth\":725},{\"type\":\"tab\",\"id\":\"nexCombat\",\"name\":\"nexCombat\",\"helpText\":\"nexCombat\",\"component\":\"nexCombat\",\"icon\":\"feather-pointed\"},{\"type\":\"tab\",\"id\":\"nexSystem\",\"name\":\"nexSystem\",\"helpText\":\"nexSystem\",\"component\":\"nexSystem\",\"icon\":\"feather-pointed\"},{\"type\":\"tab\",\"id\":\"nexTarget\",\"name\":\"nexTarget\",\"helpText\":\"nexTarget\",\"component\":\"nexTarget\",\"icon\":\"feather-pointed\"},{\"type\":\"tab\",\"id\":\"nexDefences\",\"name\":\"nexDefences\",\"helpText\":\"nexDefences\",\"component\":\"nexDefences\",\"icon\":\"feather-pointed\"},{\"type\":\"tab\",\"id\":\"nexTimers\",\"name\":\"nexTimers\",\"helpText\":\"nexTimers\",\"component\":\"nexTimers\",\"icon\":\"feather-pointed\"},{\"type\":\"tab\",\"id\":\"nexFeed\",\"name\":\"nexFeed\",\"helpText\":\"nexFeed\",\"component\":\"nexFeed\",\"icon\":\"feather-pointed\"}]}]'\n);\n"
756
+ }
757
+ ],
758
+ "text": "ng mobile",
759
+ "matching": "exact",
760
+ "whole_words": true,
761
+ "case_sensitive": true,
762
+ "prefix_suffix": true
763
+ },
764
+ {
765
+ "type": "alias",
766
+ "name": "",
767
+ "enabled": true,
768
+ "actions": [
769
+ {
770
+ "type": "script",
771
+ "enabled": true,
772
+ "script": "console.log('browser');\nconst layout = nexusclient.variables().vars.nexGui4Layout;\nconsole.log(layout);\nnexusclient.ui().layout().model().layout = JSON.parse(layout.layout);\n\nnexusclient.ui().layout().model().borders = JSON.parse(layout.borders);"
773
+ }
774
+ ],
775
+ "text": "ng browser",
776
+ "matching": "exact",
777
+ "whole_words": true,
778
+ "case_sensitive": true,
779
+ "prefix_suffix": true
780
+ },
781
+ {
782
+ "type": "alias",
783
+ "name": "",
784
+ "enabled": true,
785
+ "actions": [
786
+ {
787
+ "type": "script",
788
+ "enabled": true,
789
+ "script": "/**\nThis alias is for debugging purposes only.\nPlayers should never need to use this.\n*/\nreturn;\nnexDrop.import('nexgui4.min').then(() => {\n setTimeout(()=>{\n nexGui.bootstrapNexus();\n\n // nexusclient.packages().get('nexGui4').items.find(e => e.name == \"nexGui.colors\").items.find(e => e.name == \"balances\").enabled\n }, 2000)\n});"
790
+ }
791
+ ],
792
+ "text": "ng load",
793
+ "matching": "exact",
794
+ "whole_words": true,
795
+ "case_sensitive": true,
796
+ "prefix_suffix": true
797
+ },
798
+ {
799
+ "type": "alias",
800
+ "name": "",
801
+ "enabled": false,
802
+ "actions": [
803
+ {
804
+ "type": "script",
805
+ "enabled": true,
806
+ "script": "if (typeof nexGui === 'undefined' /*|| typeof Realm === 'undefined'*/) { return; }\n\nnexGui.aliases.call(args[1], args[2] ? args[2] : false)"
807
+ }
808
+ ],
809
+ "text": "^ng (\\w+)\\s?(.+)?$",
810
+ "matching": "regexp",
811
+ "whole_words": true,
812
+ "case_sensitive": true,
813
+ "prefix_suffix": true
814
+ }
815
+ ],
816
+ "description": "Khaseem's Nexus GUI for Nexus 3.0"
817
+ }