Merge branch 'master' of github.com:jonatkins/ingress-intel-total-conversion
This commit is contained in:
		| @@ -5,9 +5,9 @@ | |||||||
| window.debug = function() {} | window.debug = function() {} | ||||||
|  |  | ||||||
| window.debug.renderDetails = function() { | window.debug.renderDetails = function() { | ||||||
|   console.log('portals: ' + Object.keys(portals).length); |   console.log('portals: ' + window.portalsCount); | ||||||
|   console.log('links:   ' + Object.keys(links).length); |   console.log('links:   ' + window.linksCount); | ||||||
|   console.log('fields:  ' + Object.keys(fields).length); |   console.log('fields:  ' + window.fieldsCount); | ||||||
| } | } | ||||||
|  |  | ||||||
| window.debug.printStackTrace = function() { | window.debug.printStackTrace = function() { | ||||||
|   | |||||||
| @@ -572,7 +572,7 @@ window.getMarker = function(ent, portalLevel, latlng, team) { | |||||||
|  |  | ||||||
| // renders a portal on the map from the given entity | // renders a portal on the map from the given entity | ||||||
| window.renderPortal = function(ent) { | window.renderPortal = function(ent) { | ||||||
|   if(Object.keys(portals).length >= MAX_DRAWN_PORTALS && ent[0] !== selectedPortal) |   if(window.portalsCount >= MAX_DRAWN_PORTALS && ent[0] !== selectedPortal) | ||||||
|     return removeByGuid(ent[0]); |     return removeByGuid(ent[0]); | ||||||
|  |  | ||||||
|   // hide low level portals on low zooms |   // hide low level portals on low zooms | ||||||
| @@ -633,6 +633,7 @@ window.renderPortal = function(ent) { | |||||||
|         removeByGuid(portalResonatorGuid(portalGuid, i)); |         removeByGuid(portalResonatorGuid(portalGuid, i)); | ||||||
|     } |     } | ||||||
|     delete window.portals[portalGuid]; |     delete window.portals[portalGuid]; | ||||||
|  |     window.portalsCount --; | ||||||
|     if(window.selectedPortal === portalGuid) { |     if(window.selectedPortal === portalGuid) { | ||||||
|       window.unselectOldPortal(); |       window.unselectOldPortal(); | ||||||
|     } |     } | ||||||
| @@ -642,6 +643,7 @@ window.renderPortal = function(ent) { | |||||||
|     // enable for debugging |     // enable for debugging | ||||||
|     if(window.portals[this.options.guid]) throw('duplicate portal detected'); |     if(window.portals[this.options.guid]) throw('duplicate portal detected'); | ||||||
|     window.portals[this.options.guid] = this; |     window.portals[this.options.guid] = this; | ||||||
|  |     window.portalsCount ++; | ||||||
|  |  | ||||||
|     window.renderResonators(this.options.guid, this.options.details, this); |     window.renderResonators(this.options.guid, this.options.details, this); | ||||||
|     // handles the case where a selected portal gets removed from the |     // handles the case where a selected portal gets removed from the | ||||||
| @@ -781,7 +783,7 @@ window.resonatorsSetStyle = function(portalGuid, resoStyle, lineStyle) { | |||||||
|  |  | ||||||
| // renders a link on the map from the given entity | // renders a link on the map from the given entity | ||||||
| window.renderLink = function(ent) { | window.renderLink = function(ent) { | ||||||
|   if(Object.keys(links).length >= MAX_DRAWN_LINKS) |   if(window.linksCount >= MAX_DRAWN_LINKS) | ||||||
|     return removeByGuid(ent[0]); |     return removeByGuid(ent[0]); | ||||||
|  |  | ||||||
|   // some links are constructed from portal linkedEdges data. These have no valid 'creator' data. |   // some links are constructed from portal linkedEdges data. These have no valid 'creator' data. | ||||||
| @@ -823,11 +825,15 @@ window.renderLink = function(ent) { | |||||||
|  |  | ||||||
|   if(!getPaddedBounds().intersects(poly.getBounds())) return; |   if(!getPaddedBounds().intersects(poly.getBounds())) return; | ||||||
|  |  | ||||||
|   poly.on('remove', function() { delete window.links[this.options.guid]; }); |   poly.on('remove', function() { | ||||||
|  |     delete window.links[this.options.guid];  | ||||||
|  |     window.linksCount--; | ||||||
|  |   }); | ||||||
|   poly.on('add',    function() { |   poly.on('add',    function() { | ||||||
|     // enable for debugging |     // enable for debugging | ||||||
|     if(window.links[this.options.guid]) throw('duplicate link detected'); |     if(window.links[this.options.guid]) throw('duplicate link detected'); | ||||||
|     window.links[this.options.guid] = this; |     window.links[this.options.guid] = this; | ||||||
|  |     window.linksCount++; | ||||||
|     this.bringToBack(); |     this.bringToBack(); | ||||||
|   }); |   }); | ||||||
|   poly.addTo(linksLayer); |   poly.addTo(linksLayer); | ||||||
| @@ -835,7 +841,7 @@ window.renderLink = function(ent) { | |||||||
|  |  | ||||||
| // renders a field on the map from a given entity | // renders a field on the map from a given entity | ||||||
| window.renderField = function(ent) { | window.renderField = function(ent) { | ||||||
|   if(Object.keys(fields).length >= MAX_DRAWN_FIELDS) |   if(window.fieldsCount >= MAX_DRAWN_FIELDS) | ||||||
|     return window.removeByGuid(ent[0]); |     return window.removeByGuid(ent[0]); | ||||||
|  |  | ||||||
|   var old = findEntityInLeaflet(fieldsLayer, window.fields, ent[0]); |   var old = findEntityInLeaflet(fieldsLayer, window.fields, ent[0]); | ||||||
| @@ -921,11 +927,15 @@ window.renderField = function(ent) { | |||||||
|   // events, thus this listener will be attached to the field. It |   // events, thus this listener will be attached to the field. It | ||||||
|   // doesn’t matter to which element these are bound since Leaflet |   // doesn’t matter to which element these are bound since Leaflet | ||||||
|   // will add/remove all elements of the LayerGroup at once. |   // will add/remove all elements of the LayerGroup at once. | ||||||
|   poly.on('remove', function() { delete window.fields[this.options.guid]; }); |   poly.on('remove', function() { | ||||||
|  |     delete window.fields[this.options.guid]; | ||||||
|  |     window.fieldsCount--; | ||||||
|  |   }); | ||||||
|   poly.on('add',    function() { |   poly.on('add',    function() { | ||||||
|     // enable for debugging |     // enable for debugging | ||||||
|     if(window.fields[this.options.guid]) console.warn('duplicate field detected'); |     if(window.fields[this.options.guid]) console.warn('duplicate field detected'); | ||||||
|     window.fields[this.options.guid] = f; |     window.fields[this.options.guid] = f; | ||||||
|  |     window.fieldsCount++; | ||||||
|     this.bringToBack(); |     this.bringToBack(); | ||||||
|   }); |   }); | ||||||
|   f.addTo(fieldsLayer); |   f.addTo(fieldsLayer); | ||||||
|   | |||||||
| @@ -41,6 +41,7 @@ window.portalRenderLimit.previousMinLevel = -1; | |||||||
| window.portalRenderLimit.previousZoomLevel = null; | window.portalRenderLimit.previousZoomLevel = null; | ||||||
| window.portalRenderLimit.newPortalsPerLevel = new Array(MAX_PORTAL_LEVEL + 1); | window.portalRenderLimit.newPortalsPerLevel = new Array(MAX_PORTAL_LEVEL + 1); | ||||||
| window.portalRenderLimit.portalsLowerThanPrevMinLv = new Array(MAX_PORTAL_LEVEL + 1); | window.portalRenderLimit.portalsLowerThanPrevMinLv = new Array(MAX_PORTAL_LEVEL + 1); | ||||||
|  | window.portalRenderLimit.portalsLowerThanPrevMinLvCnt = new Array(MAX_PORTAL_LEVEL + 1); | ||||||
|  |  | ||||||
| window.portalRenderLimit.init = function () { | window.portalRenderLimit.init = function () { | ||||||
|   var currentZoomLevel = map.getZoom(); |   var currentZoomLevel = map.getZoom(); | ||||||
| @@ -72,6 +73,7 @@ window.portalRenderLimit.resetCounting = function() { | |||||||
| window.portalRenderLimit.resetPortalsLowerThanPrevMinLv = function() { | window.portalRenderLimit.resetPortalsLowerThanPrevMinLv = function() { | ||||||
|   for(var i = 0; i <= MAX_PORTAL_LEVEL; i++) { |   for(var i = 0; i <= MAX_PORTAL_LEVEL; i++) { | ||||||
|     portalRenderLimit.portalsLowerThanPrevMinLv[i] = {}; |     portalRenderLimit.portalsLowerThanPrevMinLv[i] = {}; | ||||||
|  |     portalRenderLimit.portalsLowerThanPrevMinLvCnt[i] = 0; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -125,6 +127,7 @@ window.portalRenderLimit.splitLowLevelPortals = function(portals) { | |||||||
|  |  | ||||||
|     if(!portalOnMap && portalLevel < portalRenderLimit.previousMinLevel) { |     if(!portalOnMap && portalLevel < portalRenderLimit.previousMinLevel) { | ||||||
|       portalRenderLimit.portalsLowerThanPrevMinLv[portalLevel][guid] = portal; |       portalRenderLimit.portalsLowerThanPrevMinLv[portalLevel][guid] = portal; | ||||||
|  |       portalRenderLimit.portalsLowerThanPrevMinLvCnt[portalLevel]++; | ||||||
|     } else { |     } else { | ||||||
|       resultPortals[guid] = portal; |       resultPortals[guid] = portal; | ||||||
|     } |     } | ||||||
| @@ -158,7 +161,7 @@ window.portalRenderLimit.setMinLevel = function() { | |||||||
|   // Find the min portal level under render limit |   // Find the min portal level under render limit | ||||||
|   while(newMinLevel > 0) { |   while(newMinLevel > 0) { | ||||||
|     var oldPortalCount = layerGroupLength(portalsLayers[newMinLevel - 1]); |     var oldPortalCount = layerGroupLength(portalsLayers[newMinLevel - 1]); | ||||||
|     var storedPortalCount = Object.keys(portalRenderLimit.portalsLowerThanPrevMinLv[newMinLevel - 1]).length; |     var storedPortalCount = portalRenderLimit.portalsLowerThanPrevMinLvCnt[newMinLevel - 1]; | ||||||
|     var newPortalCount = Math.max(storedPortalCount, portalRenderLimit.newPortalsPerLevel[newMinLevel - 1]); |     var newPortalCount = Math.max(storedPortalCount, portalRenderLimit.newPortalsPerLevel[newMinLevel - 1]); | ||||||
|  |  | ||||||
|     totalPortalsCount += oldPortalCount + newPortalCount; |     totalPortalsCount += oldPortalCount + newPortalCount; | ||||||
|   | |||||||
| @@ -245,9 +245,9 @@ window.getPaddedBounds = function() { | |||||||
| // cally detect if the render limit will be hit. | // cally detect if the render limit will be hit. | ||||||
| window.renderLimitReached = function(ratio) { | window.renderLimitReached = function(ratio) { | ||||||
|   ratio = ratio || 1; |   ratio = ratio || 1; | ||||||
|   if(Object.keys(portals).length*ratio >= MAX_DRAWN_PORTALS) return true; |   if(window.portalsCount*ratio >= MAX_DRAWN_PORTALS) return true; | ||||||
|   if(Object.keys(links).length*ratio >= MAX_DRAWN_LINKS) return true; |   if(window.linksCount*ratio >= MAX_DRAWN_LINKS) return true; | ||||||
|   if(Object.keys(fields).length*ratio >= MAX_DRAWN_FIELDS) return true; |   if(window.fieldsCount*ratio >= MAX_DRAWN_FIELDS) return true; | ||||||
|   var param = { 'reached': false }; |   var param = { 'reached': false }; | ||||||
|   window.runHooks('checkRenderLimit', param); |   window.runHooks('checkRenderLimit', param); | ||||||
|   return param.reached; |   return param.reached; | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								main.js
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								main.js
									
									
									
									
									
								
							| @@ -250,8 +250,11 @@ var portalsLayers, linksLayer, fieldsLayer; | |||||||
| // automatically kept in sync with the items on *sLayer, so never ever | // automatically kept in sync with the items on *sLayer, so never ever | ||||||
| // write to them. | // write to them. | ||||||
| window.portals = {}; | window.portals = {}; | ||||||
|  | window.portalsCount = 0; | ||||||
| window.links = {}; | window.links = {}; | ||||||
|  | window.linksCount = 0; | ||||||
| window.fields = {}; | window.fields = {}; | ||||||
|  | window.fieldsCount = 0; | ||||||
| window.resonators = {}; | window.resonators = {}; | ||||||
|  |  | ||||||
| // contain current status(on/off) of overlay layerGroups. | // contain current status(on/off) of overlay layerGroups. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| // @id             iitc-plugin-draw-tools@breunigs | // @id             iitc-plugin-draw-tools@breunigs | ||||||
| // @name           IITC plugin: draw tools | // @name           IITC plugin: draw tools | ||||||
| // @category       Layer | // @category       Layer | ||||||
| // @version        0.4.1.@@DATETIMEVERSION@@ | // @version        0.5.0.@@DATETIMEVERSION@@ | ||||||
| // @namespace      https://github.com/jonatkins/ingress-intel-total-conversion | // @namespace      https://github.com/jonatkins/ingress-intel-total-conversion | ||||||
| // @updateURL      @@UPDATEURL@@ | // @updateURL      @@UPDATEURL@@ | ||||||
| // @downloadURL    @@DOWNLOADURL@@ | // @downloadURL    @@DOWNLOADURL@@ | ||||||
| @@ -32,6 +32,33 @@ window.plugin.drawTools.loadExternals = function() { | |||||||
|   $('head').append('<style>@@INCLUDESTRING:external/leaflet.draw.css@@</style>'); |   $('head').append('<style>@@INCLUDESTRING:external/leaflet.draw.css@@</style>'); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | window.plugin.drawTools.setOptions = function() { | ||||||
|  |   window.plugin.drawTools.lineOptions = { | ||||||
|  |     stroke: true, | ||||||
|  |     color: '#f06eaa', | ||||||
|  |     weight: 4, | ||||||
|  |     opacity: 0.5, | ||||||
|  |     fill: false, | ||||||
|  |     clickable: true | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   window.plugin.drawTools.polygonOptions = { | ||||||
|  |     stroke: true, | ||||||
|  |     color: '#f06eaa', | ||||||
|  |     weight: 4, | ||||||
|  |     opacity: 0.5, | ||||||
|  |     fill: true, | ||||||
|  |     fillColor: null, | ||||||
|  |     fillOpacity: 0.2, | ||||||
|  |     clickable: true | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   window.plugin.drawTools.markerOptions = { | ||||||
|  |     icon: new L.Icon.Default(), | ||||||
|  |     zIndexOffset: 2000 | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| // renders the draw control buttons in the top left corner | // renders the draw control buttons in the top left corner | ||||||
| @@ -45,7 +72,8 @@ window.plugin.drawTools.addDrawControl = function() { | |||||||
|           + 'define the start of the polygon. Continue clicking\n' |           + 'define the start of the polygon. Continue clicking\n' | ||||||
|           + 'to draw the line you want. Click the first or last\n' |           + 'to draw the line you want. Click the first or last\n' | ||||||
|           + 'point of the line (a small white rectangle) to\n' |           + 'point of the line (a small white rectangle) to\n' | ||||||
|           + 'finish. Double clicking also works.' |           + 'finish. Double clicking also works.', | ||||||
|  |         shapeOptions: window.plugin.drawTools.polygonOptions, | ||||||
|       }, |       }, | ||||||
|  |  | ||||||
|       polyline: { |       polyline: { | ||||||
| @@ -54,7 +82,8 @@ window.plugin.drawTools.addDrawControl = function() { | |||||||
|           + 'define the start of the line. Continue clicking\n' |           + 'define the start of the line. Continue clicking\n' | ||||||
|           + 'to draw the line you want. Click the <b>last</b>\n' |           + 'to draw the line you want. Click the <b>last</b>\n' | ||||||
|           + 'point of the line (a small white rectangle) to\n' |           + 'point of the line (a small white rectangle) to\n' | ||||||
|           + 'finish. Double clicking also works.' |           + 'finish. Double clicking also works.', | ||||||
|  |         shapeOptions: window.plugin.drawTools.lineOptions, | ||||||
|       }, |       }, | ||||||
|  |  | ||||||
|       circle: { |       circle: { | ||||||
| @@ -62,13 +91,15 @@ window.plugin.drawTools.addDrawControl = function() { | |||||||
|           + 'Click on the button, then click-AND-HOLD on the\n' |           + 'Click on the button, then click-AND-HOLD on the\n' | ||||||
|           + 'map where the circle’s center should be. Move\n' |           + 'map where the circle’s center should be. Move\n' | ||||||
|           + 'the mouse to control the radius. Release the mouse\n' |           + 'the mouse to control the radius. Release the mouse\n' | ||||||
|           + 'to finish.' |           + 'to finish.', | ||||||
|  |         shapeOptions: window.plugin.drawTools.polygonOptions, | ||||||
|       }, |       }, | ||||||
|  |  | ||||||
|       marker: { |       marker: { | ||||||
|         title: 'Add a marker.\n\n' |         title: 'Add a marker.\n\n' | ||||||
|           + 'Click on the button, then click on the map where\n' |           + 'Click on the button, then click on the map where\n' | ||||||
|           + 'you want the marker to appear.' |           + 'you want the marker to appear.', | ||||||
|  |         shapeOptions: window.plugin.drawTools.markerOptions, | ||||||
|       }, |       }, | ||||||
|  |  | ||||||
|     }, |     }, | ||||||
| @@ -114,11 +145,79 @@ window.plugin.drawTools.getSnapLatLng = function(containerPoint) { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| window.plugin.drawTools.boot = function() { | window.plugin.drawTools.save = function() { | ||||||
|   //create a leaflet FeatureGroup to hold drawn items |   var data = []; | ||||||
|  |  | ||||||
|  |   window.plugin.drawTools.drawnItems.eachLayer( function(layer) { | ||||||
|  |     var item = {}; | ||||||
|  |     if (layer instanceof L.GeodesicCircle || layer instanceof L.Circle) { | ||||||
|  |       item.type = 'circle'; | ||||||
|  |       item.latLng = layer.getLatLng(); | ||||||
|  |       item.radius = layer.getRadius(); | ||||||
|  |     } else if (layer instanceof L.GeodesicPolygon || layer instanceof L.Polygon) { | ||||||
|  |       item.type = 'polygon'; | ||||||
|  |       item.latLngs = layer.getLatLngs(); | ||||||
|  |     } else if (layer instanceof L.GeodesicPolyline || layer instanceof L.Polyline) { | ||||||
|  |       item.type = 'polyline'; | ||||||
|  |       item.latLngs = layer.getLatLngs(); | ||||||
|  |     } else if (layer instanceof L.Marker) { | ||||||
|  |       item.type = 'marker'; | ||||||
|  |       item.latLng = layer.getLatLng(); | ||||||
|  |     } else { | ||||||
|  |       console.warn('Unknown layer type when saving draw tools layer'); | ||||||
|  |       return; //.eachLayer 'continue' | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     data.push(item); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   localStorage['plugin-draw-tools-layer'] = JSON.stringify(data); | ||||||
|  |  | ||||||
|  |   console.log('draw-tools: saved to localStorage'); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | window.plugin.drawTools.load = function() { | ||||||
|  |   var dataStr = localStorage['plugin-draw-tools-layer']; | ||||||
|  |   if (dataStr === undefined) return; | ||||||
|  |  | ||||||
|  |   var data = JSON.parse(dataStr); | ||||||
|  |   $.each(data, function(index,item) { | ||||||
|  |     var layer = null; | ||||||
|  |     switch(item.type) { | ||||||
|  |       case 'polyline': | ||||||
|  |         layer = L.geodesicPolyline(item.latLngs,window.plugin.drawTools.lineOptions); | ||||||
|  |         break; | ||||||
|  |       case 'polygon': | ||||||
|  |         layer = L.geodesicPolygon(item.latLngs,window.plugin.drawTools.polygonOptions); | ||||||
|  |         break; | ||||||
|  |       case 'circle': | ||||||
|  |         layer = L.circle(item.latLng,item.radius,window.plugin.drawTools.polygonOptions); | ||||||
|  |         break; | ||||||
|  |       case 'marker': | ||||||
|  |         layer = L.marker(item.latLng,window.plugin.drawTools.markerOptions) | ||||||
|  |         break; | ||||||
|  |       default: | ||||||
|  |         console.warn('unknown layer type "'+item.type+'" when loading draw tools layer'); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     if (layer) { | ||||||
|  |       window.plugin.drawTools.drawnItems.addLayer(layer); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | window.plugin.drawTools.boot = function() { | ||||||
|  |   window.plugin.drawTools.setOptions(); | ||||||
|  |  | ||||||
|  |   //create a leaflet FeatureGroup to hold drawn items | ||||||
|   window.plugin.drawTools.drawnItems = new L.FeatureGroup(); |   window.plugin.drawTools.drawnItems = new L.FeatureGroup(); | ||||||
|  |  | ||||||
|  |   //load any previously saved items | ||||||
|  |   plugin.drawTools.load(); | ||||||
|  |  | ||||||
|   //add the draw control - this references the above FeatureGroup for editing purposes |   //add the draw control - this references the above FeatureGroup for editing purposes | ||||||
|   plugin.drawTools.addDrawControl(); |   plugin.drawTools.addDrawControl(); | ||||||
|  |  | ||||||
| @@ -147,8 +246,18 @@ window.plugin.drawTools.boot = function() { | |||||||
|     var type=e.layerType; |     var type=e.layerType; | ||||||
|     var layer=e.layer; |     var layer=e.layer; | ||||||
|     window.plugin.drawTools.drawnItems.addLayer(layer); |     window.plugin.drawTools.drawnItems.addLayer(layer); | ||||||
|  |     window.plugin.drawTools.save(); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|  |   map.on('draw:deleted', function(e) { | ||||||
|  |     window.plugin.drawTools.save(); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   map.on('draw:edited', function(e) { | ||||||
|  |     window.plugin.drawTools.save(); | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -32,7 +32,7 @@ Important IITC release 0.13.0, to fix enlightened from showing up as the wrong c | |||||||
|  <li>IPAS plugin updated. This had been done earlier on desktop, but not mobile</li> |  <li>IPAS plugin updated. This had been done earlier on desktop, but not mobile</li> | ||||||
|  </ul> |  </ul> | ||||||
| <li>Plugins<ul> | <li>Plugins<ul> | ||||||
|  <li>Update mod highlither plugin</li> |  <li>Update mod highlighter plugin</li> | ||||||
|  <li>Portals list plugin updates</li> |  <li>Portals list plugin updates</li> | ||||||
|  </ul> |  </ul> | ||||||
| <li>plus various other tweaks, bug fixes, etc</li> | <li>plus various other tweaks, bug fixes, etc</li> | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ Important IITC release 0.13.0, to fix enlightened from showing up as the wrong c | |||||||
|  <li>IPAS plugin updated. This had been done earlier on desktop, but not mobile</li> |  <li>IPAS plugin updated. This had been done earlier on desktop, but not mobile</li> | ||||||
|  </ul> |  </ul> | ||||||
| <li>Plugins<ul> | <li>Plugins<ul> | ||||||
|  <li>Update mod highlither plugin</li> |  <li>Update mod highlighter plugin</li> | ||||||
|  <li>Portals list plugin updates</li> |  <li>Portals list plugin updates</li> | ||||||
|  </ul> |  </ul> | ||||||
| <li>plus various other tweaks, bug fixes, etc</li> | <li>plus various other tweaks, bug fixes, etc</li> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user