{"name":"mapdb","enabled":true,"description":"Search room names and GOTO <#>! Type MAPDB for usage.","type":"group","id":1,"items":[{"type":"function","name":"Read_Me","enabled":true,"id":15,"code":"/*\n\nMapDB v1.0.0\nby: Zahan of Achaea\n\n\nIt's finally here - a map DB for nexus! Search room names and goto room#!\n\n------------------------------\n\nUse MAPDB in-game for status/usage.\n\n------------------------------\n\nIf you have any problems or questions, send me a msg in the game, on the forum, or discord.\n\nThis plugin is provided for free but donations to Zahan (achaea) are always appreciated, no matter how small!\n\n\n\n------------------------------\n\nFuture ideas:\n- map listarea - show all rooms in area.\n- direct DIRECTORY support\n- FARSEE support\n- custom landmarks\n\n*/"},{"type":"group","name":"Functions","enabled":true,"id":32,"items":[{"type":"function","name":"onLoad","enabled":true,"id":2,"code":"// Initialize\nif (typeof mapdb == 'undefined') {\n mapdb = {};\n mapdb.db = {};\n mapdb.info = {\n 'last_saved' : 0\n };\n mapdb_f = {}; // functions\n mapdb_v = {}; // variables\n}\n\n// Default settings\nmapdb.settings = {\n\t'game' : 'achaea',\n 'pagelength' : 20\n};\n\n// Map \"this\"\nmapdb_v.that = {\n\t'xmlScript' : Map.xmlScript,\n\t'map_host' : mapdb.settings.game+'.com',\n\t'map_protocol' : 'https'\n};\n\n// Save\nmapdb_f.save = function () {\n set_variable('mapdb', mapdb);\n};\n\n// Load\nmapdb_f.load = function () {\n var saved = get_variable('mapdb');\n if (saved)\n mapdb = saved;\n};\nmapdb_f.load();\n\n// Status bar display\nmapdb_f.add_div = function (toggle) {\n $('#mapdb').remove();\n if (toggle != false) {\n\t\tlet mapdb_div = '
MapDB (0/'+mapdb_v.area_list.length+')
';\n\t\t$('#character_module_status').append(mapdb_div);\n }\n\t$('#character_module_status').css('overflow', 'visible');\n\tredraw_interface();\n};\n\n// Stop db update\nmapdb_f.stop_update = function () {\n if (mapdb_v.update_stopped) {\n delete mapdb_v.update_stopped;\n mapdb_f.start_interval(true);\n return;\n }\n let r_count = Object.keys(mapdb.db).length;\n $('#mapdb .fa-download').css('color', '#ffff4e');\n clearInterval(mapdb_i);\n mapdb_v.update_stopped = true;\n clearInterval(mapdb_i);\n};\n\n// Start db update\nmapdb_f.update_db = function () {\n mapdb_v.area_list = [];\n\tvar map = mapdb_v.that;\n // get area list\n $.get(map.xmlScript, {url: map.map_host, protocol: map.map_protocol, area: 'areas'}, function (data) {\n var xml;\n try {\n xml = JSON.parse(data);\n } \n catch (err) {\n display_notice(\"Error occured acquiring mapped areas list. Check console log for details.\", \"red\");\n console.log(err);\n return;\n }\n // parse xml\n $('area', xml).each(function () {\n var id = parseInt($(this).attr(\"id\"));\n //var name = $(this).attr(\"name\");\n mapdb_v.area_list.push(id);\n });\n // count\n let a_count = mapdb_v.area_list.length;\n if (a_count == 0) {\n\t\t\tdisplay_notice('Mapdb failed to acquire areas list. Update aborted.', 'red');\n\t\t\treturn;\n \t}\n // start interval\n mapdb_f.start_interval(false);\n display_notice(\"MapDB starting update. This should take about 30 seconds, but it is okay to do other stuff meanwhile. Check the icon on the stat-bar for download details.\", \"yellow\");\n });\n}\n\n// Get room list\nmapdb_f.get_rooms = function (area_num) {\n\tvar map = mapdb_v.that;\n\t$.get(map.xmlScript, {url: map.map_host, protocol: map.map_protocol, area: area_num}, function (data) {\n // failsafe - no data\n if (data.match('404 Not Found'))\n \t return;\n // setup xml\n var xml;\n try {\n xml = JSON.parse(data);\n } catch (err) {\n display_notice(\"Error occured acquiring area list. Check console log for details.\", \"red\");\n console.log(err);\n return;\n }\n // parse xml\n $(\"room\", xml).each(function () {\n let area = $(this).parent().parent().attr(\"name\");\n let id = $(this).attr(\"id\");\n let title = $(this).attr(\"title\");\n mapdb.db[id] = {\n 'title' : title,\n 'area' : area\n };\n });\n\t});\n};\n\n// Interval\nmapdb_f.start_interval = function (restart) {\n // add div\n if (!restart || !mapdb_v.i_count) {\n \tmapdb_f.add_div(true);\n mapdb_v.i_count = 0;\n }\n ///$('#mapdb .fa-download').css('color', '#ffff4e');\n $('#mapdb .fa-download').css('color', 'limegreen');\n // set interval\n if (typeof mapdb_i != 'undefined')\n \tclearInterval(mapdb_i); \n\tmapdb_i = setInterval(function(){\n let area_num = mapdb_v.area_list[mapdb_v.i_count];\n mapdb_f.get_rooms(area_num);\n // blink icon\n\t\tmapdb_v.i_count += 1;\n $('#mapdb .fa-download').fadeOut(200, function() {\n \t\t$('#mapdb .fa-download').fadeIn(200, function(){\n \t\t\t$('#mapdb_count').html(mapdb_v.i_count);\n \t\t});\n\t\t});\n // stop interval\n let max = mapdb_v.area_list.length;\n if (mapdb_v.i_count >= max) {\n\t\t\tmapdb_f.stop_interval();\n }\n }, 100);\n};\nmapdb_f.stop_interval = function () {\n clearInterval(mapdb_i);\n $('#mapdb .fa-download').css('color', 'limegreen');\n setTimeout(function(){\n \tmapdb_f.add_div(false);\n mapdb.info.last_saved = mapdb_f.get_date();\n mapdb_f.save();\n }, 1000);\n let r_count = Object.keys(mapdb.db).length;\n display_notice('MapDB database update complete! '+r_count+' rooms stored.', 'limegreen');\n};\n\n// Return date\nmapdb_f.get_date = function () {\n var today = new Date();\n\tvar year = today.getFullYear();\n var month = today.getMonth()+1;\n\tif (month < 10)\n \tmonth = '0'+month;\n var date = today.getDate();\n\tif (date < 10)\n \tdate = '0'+date;\n\tvar day = year+month+date;\n return Number(day);\n};\n\n// Display_with html\nmapdb_f.display_html = function (line) {\n line = '

'+line+'

';\n\tif (extra_break && line.length)\n line += \"
\";\n ow_Write(\"#output_main\", line);\n};\n\n// Menu\nmapdb_f.display_menu = function (only_mapdb) {\n\t// menu arrays\n\tvar menu = [];\n\tmenu.push({'title':'MAP SHOW', 'info':'- shows the map nearby you.'});\n\tmenu.push({'title':'MAP LIST', 'info':'- lists available maps by name.'});\n\tmenu.push({'title':'MAP RADIUS <0 to 5>', 'info':'- size of visible map for MAP command.'});\n\tmenu.push({'title':'MAP HEIGHT <0 to 5>', 'info':'- height of visible map for MAP command.'});\n\tmenu.push({'title':'MAP WIDTH <0 to 5>', 'info':'- width of visible map for MAP command.'});\n\tvar add_menu = [];\n\n add_menu.push({'title':'MAP INFO', 'info':'- shows map information for current room.'});\n add_menu.push({'title':'MAP INFO <#>', 'info':'- shows map information for room with matching ID#.'});\n add_menu.push({'title':'MAP FIND ', 'info':'- searches room names for phrase.'});\n add_menu.push({'title':'GOTO <#>', 'info':'- walks to room with matching ID#.'});\n add_menu.push({'title':'GOTO ', 'info':'- traditional WALK TO command.'});\n add_menu.push({'title':'ROOM GMCP', 'info':'- displays current room\\'s GMCP info.'});\n\tadd_menu.push({'title':'MAPDB UPDATE', 'info':'- manually updates database.'});\n //add_menu.push({'title':'MAPDB RELOAD', 'info':'- reloads the mapdb plugin.'}); \n\t// build line\n var line = '';\n if (!only_mapdb) {\n\t\tline += 'Standard commands:
';\n\t\tfor (let i=0; i/g, \">\");\n\t\t line += ' '+title+space+menu[i].info+'
';\n\t\t}\n line += '
';\n }\n\tline += 'MapDB commands:
';\n\tfor (let i=0; i/g, \">\");\n\t line += ' '+title+space+add_menu[i].info+'
';\n\t}\n\tmapdb_f.display_html(''+line+'');\n};\n\n// Updata the database\nmapdb_f.auto_update = function () {\n\tif ((mapdb_f.get_date()-mapdb.info.last_saved) > 0) {\n\t mapdb_f.update_db();\n\t}\n};\nmapdb_f.auto_update();\n\n// Get pagelength\nmapdb_f.get_pagelength = function () {\n\treflex_enable(client.reflex_find_by_name(\"group\", \"Pagelength\", true, false, \"Mapdb\"));\n\tsend_command('Config pagelength', 1);\n};\nmapdb_f.get_pagelength();\n\n// Notify load\nmapdb_f.loaded_log = function () {\n reflex_disable(client.reflex_find_by_name(\"alias\", \"more\", true, false, \"Mapdb\"));\n\tdisplay_notice('MapDB loaded.', 'limegreen');\n\tconsole.log(mapdb);\n};\nmapdb_f.loaded_log();"},{"type":"function","name":"onGMCP","enabled":true,"id":28,"code":"if (args.gmcp_method === \"Room.Info\") {\n if (typeof mapdb_v == 'undefined')\n return;\n // copy object\n\tmapdb_v.room_gmcp = {};\n for (let key in args.gmcp_args)\n mapdb_v.room_gmcp[key] = args.gmcp_args[key];\n let roominfo = mapdb_v.room_gmcp;\n // room# on vessel\n if (roominfo.num < 1)\n \troominfo.num = roominfo.ohmap;\n // handle exits\n let roomexits = [];\n for (let exit in roominfo.exits)\n roomexits.push(exit);\n roominfo.exits = roomexits.join(',');\n}"},{"type":"alias","name":"","enabled":true,"id":35,"matching":"exact","whole_words":false,"case_sensitive":false,"prefix_suffix":true,"actions":[{"action":"script","script":"console.log(mapdb);"}],"text":"mapdb log"}],"actions":[]},{"type":"group","name":"Aliases","enabled":true,"id":30,"items":[{"type":"alias","name":"map","enabled":false,"id":16,"matching":"regexp","whole_words":false,"case_sensitive":false,"prefix_suffix":true,"actions":[{"action":"script","script":"// Failsafe - fresh install\nif (typeof mapdb == 'undefined')\n send_command('mapdb reload');\n\n// Echo command\nif (echo_input)\n\tprint(args[0], color_inputecho);\n\nmapdb_f.display_menu();"}],"text":"^map$"},{"type":"alias","name":"map show","enabled":false,"id":17,"matching":"regexp","whole_words":false,"case_sensitive":false,"prefix_suffix":true,"actions":[{"action":"script","script":"send_command('map', 1);"}],"text":"^map show$"},{"type":"alias","name":"map ","enabled":false,"id":18,"matching":"regexp","whole_words":false,"case_sensitive":false,"prefix_suffix":true,"actions":[{"action":"script","script":"// Failsafe - fresh install\nif (typeof mapdb == 'undefined')\n\tsend_command('mapdb reload');\n\nlet arg = args[1].toLowerCase();\nlet menu = ['list', 'radius', 'height', 'width', 'info', 'find', 'show'];\nvar match = false;\nfor (let i=0; i
';\n}\n\n// Check db\nif (!mapdb.db[rnum]) {\n mapdb_f.display_html('You are unable to find any map information for room #'+rnum+'.');\n\treturn;\n}\n\n// Build echo\nvar space = '';\nlet title = mapdb.db[rnum].title;\nvar area = mapdb.db[rnum].area;\nvar area_piece = String(area.match(/, [A-Za-z0-9 ]+/));\nif (area_piece != \"null\") {\n\tif (area_piece.slice(-1) == ' ')\n\t area = area.replace(area_piece, \" \");\n\telse\n\t area = area.replace(area_piece, \"\");\n\tarea_piece = String(area_piece.replace(/, /, \"\"));\n\tarea = area_piece+\" \"+area;\n\tarea = area.replace(/ (\\s+)/g, ' ');\n} \nlet slen = rnum.toString().length;\nfor (let i=0; i<(6-slen); i++)\n\tspace += ' ';\nline += \n\t' '+space+'#'+rnum+' ' +\n ''+title+'' +\n ' in '+area+'.'\n;\n\n// Echo\nmapdb_f.display_html(line);"}],"text":"^map info(| (\\d+))$"},{"type":"alias","name":"map find ","enabled":true,"id":12,"matching":"regexp","whole_words":false,"case_sensitive":false,"prefix_suffix":true,"actions":[{"action":"script","script":"// Failsafe - fresh install\nif (typeof mapdb == 'undefined')\n\tsend_command('mapdb reload');\n\n// Echo command\nif (echo_input)\n\tprint(args[0], color_inputecho);\n\nargs[1] = args[1].toLowerCase();\n\n// Build match table\nlet check = args[1].replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\ncheck = new RegExp(check, 'gi');\nmapdb_v.find_match = [];\nlet room_count = 0;\nlet map = mapdb.db;\nfor (let key in map) {\n room_count += 1;\n let title = map[key].title;\n if (title.match(check))\n mapdb_v.find_match.push({'id':key, 'title':map[key].title, 'area':map[key].area});\n}\n\n// Check matches\nif (!mapdb_v.find_match || mapdb_v.find_match.length == 0) {\n display_notice('0 matches for \"'+args[1]+'\" (out of '+room_count+' rooms) found.', '#aaa');\n return;\n}\n\n// Display match table\nmapdb_f.display_matches = function (new_search) {\n // 0 matches\n if (!mapdb_v.find_match || mapdb_v.find_match.length == 0) {\n display_notice('0 matches (out of '+room_count+' rooms) found.', '#aaa');\n return;\n }\n \n var match = mapdb_v.find_match;\n // pagenation\n if (new_search || !mapdb_v.match_page)\n mapdb_v.match_page = 1;\n else\n \tmapdb_v.match_page += 1; \n let page_num = mapdb_v.match_page;\t\n let limit = (match.length < mapdb.settings.pagelength) ? match.length:mapdb.settings.pagelength;\n let start = (page_num-1)*limit;\n limit = (page_num > 1) ? start+limit:limit;\n limit = (limit > match.length) ? match.length:limit;\n \n // failsafe - no more matches\n if (start >= match.length) {\n display_notice('An unseen presence whispers in your ear, \"There is no more, friend.\"');\n return;\n }\n \n\t// add header\n var line = '';\n\tif (page_num == 1) {\n let plural = '';\n \tif (match.length > 1)\n\t plural = 'es';\n //line = ''+match.length+' match'+plural+' for \"'+args[1]+'\" (out of '+room_count+' rooms) found:
';\n line = ''+match.length+' match'+plural+' for \"'+args[1]+'\" found:
';\n }\n else\n line = '[Results continued via MORE]
';\n \n\t// add matches\n for (let i=start; i'+space+'#'+match[i].id+'
' +\n \t''+title+'' +\n \t' in '+area+'.'\n ;\n if (i < (limit-1))\n line += '
';\n }\n \n // add footer\n let page_total = Math.ceil(match.length/mapdb.settings.pagelength);\n if (page_num < page_total && page_total != 1) {\n let a_more = client.reflex_find_by_name(\"alias\", \"more\", true, false, \"Mapdb\");\n\t\treflex_enable(a_more);\n let perc = Math.floor((limit/match.length)*100);\n line += '
[Type MORE to continue results. ('+perc+'% shown)]';\n \n }\n else {\n line += '
(Click the room title or type GOTO <#> to walk to that destination.)';\n }\n \n // display\n\tmapdb_f.display_html(line);\n};\n\nmapdb_f.click_find = function (id) {\n send_command('PATH FIND '+id);\n};\n\nmapdb_f.click_more = function () {\n send_command('MORE');\n};\n\nmapdb_f.display_matches(true);"}],"text":"^map find (.*?)$"},{"type":"alias","name":"goto ","enabled":true,"id":19,"matching":"regexp","whole_words":false,"case_sensitive":false,"prefix_suffix":true,"actions":[{"action":"script","script":"var room = Number(args[1]);\nif (Number.isInteger(room))\n send_command('path track '+room);\nelse \n send_command('walk to '+args[1]);"}],"text":"^goto (.*?)$"},{"type":"alias","name":"room gmcp","enabled":true,"id":27,"matching":"regexp","whole_words":false,"case_sensitive":false,"prefix_suffix":true,"actions":[{"action":"script","script":"// Failsafe - fresh install\nif (typeof mapdb == 'undefined') {\n send_command('mapdb reload');\n send_command('ql');\n}\n\n// Echo command\nif (echo_input)\n\tprint(args[0], color_inputecho);\n\nvar line = \n 'Current Room Info
'+\n\t'-------------------------------------------------------
'\n;\nlet roominfo = mapdb_v.room_gmcp;\nfor (let key in roominfo) {\n if (key == 'ohmap' || key == 'map' || key == 'coordsX')\n continue;\n if (roominfo[key] == '')\n roominfo[key] = '-';\n let Key = key.substr(0,1).toUpperCase()+key.substr(1);\n if (Key == 'Num')\n Key = 'ID#';\n let space = '';\n for (let i=0; i<(12-Key.length); i++)\n\t space += ' ';\n line += ''+Key+':'+space+roominfo[key]+'
';\n}\nmapdb_f.display_html(''+line+'');"}],"text":"^room gmcp$"},{"type":"alias","name":"mapdb update","enabled":true,"id":7,"matching":"regexp","whole_words":false,"case_sensitive":false,"prefix_suffix":true,"actions":[{"action":"script","script":"// Failsafe - fresh install\nif (typeof mapdb == 'undefined')\n send_command('mapdb reload');\n\n// Echo command\nif (echo_input)\n\tprint(args[0], color_inputecho);\n\nmapdb_f.update_db();"}],"text":"^mapdb update$"},{"type":"alias","name":"","enabled":true,"id":5,"matching":"begins","whole_words":true,"case_sensitive":true,"prefix_suffix":true,"actions":[{"action":"function","fn":"onLoad"}],"text":"mapdb reload"}],"actions":[]},{"type":"group","name":"Triggers","enabled":true,"id":31,"items":[{"type":"trigger","name":"type more","enabled":true,"id":14,"matching":"exact","whole_words":false,"case_sensitive":true,"text":"[Type MORE if you wish to continue reading. (% shown)]","actions":[{"action":"script","script":"let a_more = client.reflex_find_by_name(\"alias\", \"more\", true, false, \"Mapdb\");\nreflex_disable(a_more);"}]},{"type":"trigger","name":"","enabled":true,"id":26,"matching":"regexp","whole_words":false,"case_sensitive":false,"text":"^Your current pagelength: (\\d+)","actions":[{"action":"script","script":"if (typeof mapdb != 'undefined' && mapdb.settings)\n\tmapdb.settings.pagelength = Number(args[1])-2;\nvar reflex = client.reflex_find_by_name(\"group\", \"Pagelength\", true, false, \"Mapdb\");\nif (reflex.enabled) {\n gag_current_line();\n\treflex_disable(reflex);\n}"}]},{"type":"alias","name":"more","enabled":false,"id":13,"matching":"regexp","whole_words":false,"case_sensitive":false,"prefix_suffix":true,"actions":[{"action":"script","script":"// Failsafe - fresh install\nif (typeof mapdb == 'undefined')\n\tsend_command('mapdb reload');\n\n// Echo command\nif (echo_input)\n\tprint(args[0], color_inputecho);\n\nmapdb_f.display_matches();"}],"text":"^more$"}],"actions":[]},{"type":"group","name":"Pagelength","enabled":false,"id":21,"items":[{"type":"trigger","name":"","enabled":true,"id":20,"matching":"begins","whole_words":false,"case_sensitive":false,"text":"Pagelength is the maximum number of lines that will be displayed to you at once","actions":[{"action":"gag"}]},{"type":"trigger","name":"","enabled":true,"id":22,"matching":"begins","whole_words":false,"case_sensitive":false,"text":"Usage:","actions":[{"action":"gag"}]},{"type":"trigger","name":"","enabled":true,"id":24,"matching":"regexp","whole_words":false,"case_sensitive":true,"text":"^(\\s+)CONFIG PAGELENGTH","actions":[{"action":"gag"}]}],"actions":[]}]}