Add resonator re-render logic
Resonator will re-render if it's level/energy/distance changed Bring portal to front after resonators re-rendered.
This commit is contained in:
@ -227,7 +227,7 @@ window.renderPortal = function(ent) {
|
||||
u = u || oo.level !== portalLevel;
|
||||
// nothing for the portal changed, so don’t update. Let resonators
|
||||
// manage themselves if they want to be updated.
|
||||
if(!u) return renderResonators(ent);
|
||||
if(!u) return renderResonators(ent, old);
|
||||
// there were changes, remove old portal
|
||||
removeByGuid(ent[0]);
|
||||
}
|
||||
@ -237,7 +237,6 @@ window.renderPortal = function(ent) {
|
||||
// pre-loads player names for high zoom levels
|
||||
loadPlayerNamesForPortal(ent[2]);
|
||||
|
||||
|
||||
var lvWeight = Math.max(2, portalLevel / 1.5);
|
||||
var lvRadius = Math.max(portalLevel + 3, 5);
|
||||
|
||||
@ -261,7 +260,7 @@ window.renderPortal = function(ent) {
|
||||
// all resonators have already removed by zooming
|
||||
if(isResonatorsShow()) {
|
||||
for(var i = 0; i <= 7; i++)
|
||||
removeByGuid(portalResonatorGuid(portalGuid,i));
|
||||
removeByGuid(portalResonatorGuid(portalGuid, i));
|
||||
}
|
||||
delete window.portals[portalGuid];
|
||||
if(window.selectedPortal === portalGuid) {
|
||||
@ -287,7 +286,7 @@ window.renderPortal = function(ent) {
|
||||
window.map.setView(latlng, 17);
|
||||
});
|
||||
|
||||
window.renderResonators(ent);
|
||||
window.renderResonators(ent, null);
|
||||
|
||||
window.runHooks('portalAdded', {portal: p});
|
||||
|
||||
@ -295,18 +294,28 @@ window.renderPortal = function(ent) {
|
||||
p.addTo(layerGroup);
|
||||
}
|
||||
|
||||
window.renderResonators = function(ent) {
|
||||
window.renderResonators = function(ent, portalLayer) {
|
||||
if(!isResonatorsShow()) return;
|
||||
|
||||
var portalLevel = getPortalLevel(ent[2]);
|
||||
if(portalLevel < getMinPortalLevel() && ent[0] != selectedPortal) return;
|
||||
|
||||
if(!isResonatorsShow()) return;
|
||||
|
||||
for(var i=0; i < ent[2].resonatorArray.resonators.length; i++) {
|
||||
var layerGroup = portalsLayers[parseInt(portalLevel)];
|
||||
var reRendered = false;
|
||||
for(var i = 0; i < ent[2].resonatorArray.resonators.length; i++) {
|
||||
var rdata = ent[2].resonatorArray.resonators[i];
|
||||
|
||||
if(rdata == null) continue;
|
||||
// skip if resonator didn't change
|
||||
if(portalLayer) {
|
||||
var oldRes = findEntityInLeaflet(layerGroup, window.resonators, portalResonatorGuid(ent[0], i));
|
||||
if(oldRes && isSameResonator(oldRes.options.details, rdata)) continue;
|
||||
}
|
||||
|
||||
if(window.resonators[portalResonatorGuid(ent[0],i)]) continue;
|
||||
// skip and remove old resonator if no new resonator
|
||||
if(rdata === null) {
|
||||
if(oldRes) removeByGuid(oldRes.options.guid);
|
||||
continue;
|
||||
}
|
||||
|
||||
// offset in meters
|
||||
var dn = rdata.distanceToPortal*SLOT_TO_LAT[rdata.slot];
|
||||
@ -332,13 +341,16 @@ window.renderResonators = function(ent) {
|
||||
level: rdata.level,
|
||||
details: rdata,
|
||||
pDetails: ent[2],
|
||||
guid: portalResonatorGuid(ent[0],i) });
|
||||
guid: portalResonatorGuid(ent[0], i) });
|
||||
|
||||
r.on('remove', function() { delete window.resonators[this.options.guid]; });
|
||||
r.on('add', function() { window.resonators[this.options.guid] = this; });
|
||||
|
||||
r.addTo(portalsLayers[parseInt(portalLevel)]);
|
||||
reRendered = true;
|
||||
}
|
||||
// if there is any resonator re-rendered, bring portal to front
|
||||
if(reRendered && portalLayer) portalLayer.bringToFront();
|
||||
}
|
||||
|
||||
// append portal guid with -resonator-[slot] to get guid for resonators
|
||||
@ -350,6 +362,15 @@ window.isResonatorsShow = function() {
|
||||
return map.getZoom() >= RESONATOR_DISPLAY_ZOOM_LEVEL;
|
||||
}
|
||||
|
||||
window.isSameResonator = function(oldRes, newRes) {
|
||||
if(!oldRes && !newRes) return true;
|
||||
if(typeof oldRes !== typeof newRes) return false;
|
||||
if(oldRes.level !== newRes.level) return false;
|
||||
if(oldRes.energyTotal !== newRes.energyTotal) return false;
|
||||
if(oldRes.distanceToPortal !== newRes.distanceToPortal) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
window.portalResetColor = function(portal) {
|
||||
portal.setStyle({color: portal.options.fillColor});
|
||||
}
|
||||
|
Reference in New Issue
Block a user