MediaWiki:Common.js: Difference between revisions

From Rise of Agon Wiki
Admin (talk | contribs)
Add Leaflet map viewer JavaScript
 
Admin (talk | contribs)
Use Leaflet.Zoomify plugin for proper tile loading
 
(10 intermediate revisions by the same user not shown)
Line 1: Line 1:
// Agon World Map with Leaflet
// Custom Agon World Map with Leaflet + Zoomify tiles
(function() {
(function() {
  // Load Leaflet library
    if (!document.getElementById('agon-map-container')) return;
  if (typeof L === 'undefined') {
    mw.loader.load('https://unpkg.com/leaflet@1.9.4/dist/leaflet.css', 'text/css');
    mw.loader.load('https://unpkg.com/leaflet@1.9.4/dist/leaflet.js');
  }


  // Initialize map when page loads
    var link = document.createElement('link');
  mw.hook('wikipage.content').add(function($content) {
    link.rel = 'stylesheet';
     var $mapContainer = $content.find('.agon-map-container');
     link.href = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.css';
     if ($mapContainer.length === 0) return;
     document.head.appendChild(link);


     // Wait for Leaflet to load
     var script = document.createElement('script');
     function initMap() {
    script.src = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.js';
      if (typeof L === 'undefined') {
     script.onload = function() {
         setTimeout(initMap, 100);
        // Load Leaflet.Zoomify plugin
        return;
        var zoomifyScript = document.createElement('script');
      }
        zoomifyScript.src = 'https://cdn.jsdelivr.net/npm/leaflet-zoomify@1.0.6/src/L.TileLayer.Zoomify.js';
        zoomifyScript.onload = function() { initAgonMap(); };
         document.head.appendChild(zoomifyScript);
    };
    document.head.appendChild(script);
})();


      var bounds = [[0, 0], [1000, 1000]];
function initAgonMap() {
      var map = L.map('agon-world-map', {
    var mapContainer = document.getElementById('agon-map-container');
        crs: L.CRS.Simple,
    if (!mapContainer) return;
        minZoom: -2,
        maxZoom: 2,
        zoomControl: true,
        attributionControl: false
      });


      // Add the Agon map image as a tile layer
    var imageWidth = 16384;
      var imageUrl = '/resources/assets/AgonBigMap.png';
    var imageHeight = 16384;
      L.imageOverlay(imageUrl, bounds).addTo(map);
   
      map.fitBounds(bounds);
    var bounds = [[0, 0], [imageHeight, imageWidth]];


      // Fetch markers from semantic properties
     var map = L.map('agon-map-container', {
      fetchMarkers(map);
        crs: L.CRS.Simple,
     }
         minZoom: 0,
 
         maxZoom: 6
    initMap();
  });
 
  function fetchMarkers(map) {
    // Query the API for all pages with coordinates
    new mw.Api().get({
      action: 'ask',
      query: '[[Category:Location]]|?Has coordinates|?Location type|?Mob type|?Has loot|?Dungeon name|?Level range|limit=500',
      format: 'json'
    }).done(function(data) {
      if (data.query && data.query.results) {
         Object.keys(data.query.results).forEach(function(pageName) {
          var page = data.query.results[pageName];
          if (page.printouts && page.printouts['Has coordinates']) {
            var coords = page.printouts['Has coordinates'][0];
            if (coords) {
              addMarker(map, pageName, coords, page.printouts);
            }
          }
         });
      }
     });
     });
  }


  function addMarker(map, name, coords, data) {
     // Zoomify tile layer
     // Parse coordinates (assuming "X, Y" format)
     var zoomifyUrl = mw.config.get('wgScriptPath') + '/resources/assets/tiles/AgonBigMap/';
     var parts = coords.split(',').map(function(s) { return parseFloat(s.trim()); });
    L.tileLayer.zoomify(zoomifyUrl, {
    if (parts.length !== 2 || isNaN(parts[0]) || isNaN(parts[1])) return;
        width: imageWidth,
 
        height: imageHeight,
    var latlng = [parts[0], parts[1]];
        bounds: bounds
    }).addTo(map);
      
      
     // Choose marker color based on type
     map.fitBounds(bounds);
    var type = data['Location type'] && data['Location type'][0] ? data['Location type'][0] : 'Unknown';
     L.control.scale().addTo(map);
     var color = getMarkerColor(type);


     var marker = L.circleMarker(latlng, {
     // Click shows pixel coords (Y, X)
      radius: 8,
    map.on('click', function(e) {
      fillColor: color,
        var y = e.latlng.lat.toFixed(2);
      color: '#0f1b2c',
        var x = e.latlng.lng.toFixed(2);
      weight: 2,
        var text = 'Coordinates: ' + y + ', ' + x;
      opacity: 1,
        console.log(text);
      fillOpacity: 0.8
        L.popup().setLatLng(e.latlng).setContent(text).openOn(map);
    }).addTo(map);
    });


     // Create popup content
     // Markers use stored pixel coords 'Y, X'
     var popupContent = '<div class="marker-info">';
     if (window.agonMapMarkers) {
    popupContent += '<h3>' + name + '</h3>';
        window.agonMapMarkers.forEach(function(marker) {
    popupContent += '<p><strong>Type:</strong> ' + type + '</p>';
            var coords = marker.coordinates.split(',').map(parseFloat);
   
            var icon = L.icon({
    if (data['Mob type'] && data['Mob type'][0]) {
                iconUrl: marker.icon || mw.config.get('wgScriptPath') + '/resources/assets/marker-icon.png',
      popupContent += '<p><strong>Mobs:</strong> ' + data['Mob type'][0] + '</p>';
                iconSize: [25, 41],
    }
                iconAnchor: [12, 41],
    if (data['Has loot'] && data['Has loot'][0]) {
                popupAnchor: [1, -34]
      popupContent += '<p><strong>Loot:</strong> ' + data['Has loot'][0] + '</p>';
            });
            L.marker([coords[0], coords[1]], { icon: icon })
                .addTo(map)
                .bindPopup('<b>' + marker.name + '</b><br>' + marker.description);
        });
     }
     }
    if (data['Dungeon name'] && data['Dungeon name'][0]) {
}
      popupContent += '<p><strong>Dungeon:</strong> ' + data['Dungeon name'][0] + '</p>';
    }
    if (data['Level range'] && data['Level range'][0]) {
      popupContent += '<p><strong>Level:</strong> ' + data['Level range'][0] + '</p>';
    }
   
    popupContent += '<p><a href="/wiki/' + encodeURIComponent(name.replace(/ /g, '_')) + '">View Details →</a></p>';
    popupContent += '</div>';
 
    marker.bindPopup(popupContent);
  }
 
  function getMarkerColor(type) {
    var colors = {
      'Spawn Point': '#ff6b6b',
      'Key Chest': '#f39c12',
      'Portal': '#9b59b6',
      'Dungeon Entrance': '#e74c3c',
      'Clan Holding': '#3498db',
      'Wilderness Bank': '#2ecc71'
    };
    return colors[type] || '#95a5a6';
  }
})();

Latest revision as of 09:14, 25 January 2026

// Custom Agon World Map with Leaflet + Zoomify tiles
(function() {
    if (!document.getElementById('agon-map-container')) return;

    var link = document.createElement('link');
    link.rel = 'stylesheet';
    link.href = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.css';
    document.head.appendChild(link);

    var script = document.createElement('script');
    script.src = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.js';
    script.onload = function() {
        // Load Leaflet.Zoomify plugin
        var zoomifyScript = document.createElement('script');
        zoomifyScript.src = 'https://cdn.jsdelivr.net/npm/leaflet-zoomify@1.0.6/src/L.TileLayer.Zoomify.js';
        zoomifyScript.onload = function() { initAgonMap(); };
        document.head.appendChild(zoomifyScript);
    };
    document.head.appendChild(script);
})();

function initAgonMap() {
    var mapContainer = document.getElementById('agon-map-container');
    if (!mapContainer) return;

    var imageWidth = 16384;
    var imageHeight = 16384;
    
    var bounds = [[0, 0], [imageHeight, imageWidth]];

    var map = L.map('agon-map-container', {
        crs: L.CRS.Simple,
        minZoom: 0,
        maxZoom: 6
    });

    // Zoomify tile layer
    var zoomifyUrl = mw.config.get('wgScriptPath') + '/resources/assets/tiles/AgonBigMap/';
    L.tileLayer.zoomify(zoomifyUrl, {
        width: imageWidth,
        height: imageHeight,
        bounds: bounds
    }).addTo(map);
    
    map.fitBounds(bounds);
    L.control.scale().addTo(map);

    // Click shows pixel coords (Y, X)
    map.on('click', function(e) {
        var y = e.latlng.lat.toFixed(2);
        var x = e.latlng.lng.toFixed(2);
        var text = 'Coordinates: ' + y + ', ' + x;
        console.log(text);
        L.popup().setLatLng(e.latlng).setContent(text).openOn(map);
    });

    // Markers use stored pixel coords 'Y, X'
    if (window.agonMapMarkers) {
        window.agonMapMarkers.forEach(function(marker) {
            var coords = marker.coordinates.split(',').map(parseFloat);
            var icon = L.icon({
                iconUrl: marker.icon || mw.config.get('wgScriptPath') + '/resources/assets/marker-icon.png',
                iconSize: [25, 41],
                iconAnchor: [12, 41],
                popupAnchor: [1, -34]
            });
            L.marker([coords[0], coords[1]], { icon: icon })
                .addTo(map)
                .bindPopup('<b>' + marker.name + '</b><br>' + marker.description);
        });
    }
}