MediaWiki:Common.js: Difference between revisions

From Rise of Agon Wiki
Admin (talk | contribs)
Add Leaflet map viewer JavaScript
 
Admin (talk | contribs)
Add Leaflet map integration
Line 1: Line 1:
// Agon World Map with Leaflet
// Custom Agon World Map with Leaflet
(function() {
(function() {
  // Load Leaflet library
    // Only run on map pages
  if (typeof L === 'undefined') {
    if (!document.getElementById('agon-map-container')) return;
     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');
    // Load Leaflet CSS
  }
    var link = document.createElement('link');
     link.rel = 'stylesheet';
    link.href = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.css';
    document.head.appendChild(link);
   
    // Load Leaflet JS
    var script = document.createElement('script');
     script.src = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.js';
    script.onload = function() {
        initAgonMap();
    };
    document.head.appendChild(script);
})();


  // Initialize map when page loads
function initAgonMap() {
  mw.hook('wikipage.content').add(function($content) {
     var mapContainer = document.getElementById('agon-map-container');
     var $mapContainer = $content.find('.agon-map-container');
     if (!mapContainer) return;
     if ($mapContainer.length === 0) return;
   
 
     // Image dimensions
     // Wait for Leaflet to load
     var imageWidth = 16384;
     function initMap() {
    var imageHeight = 16384;
      if (typeof L === 'undefined') {
   
        setTimeout(initMap, 100);
    // Create map with custom CRS for image coordinates
        return;
    var map = L.map('agon-map-container', {
      }
 
      var bounds = [[0, 0], [1000, 1000]];
      var map = L.map('agon-world-map', {
         crs: L.CRS.Simple,
         crs: L.CRS.Simple,
         minZoom: -2,
         minZoom: -3,
         maxZoom: 2,
         maxZoom: 2,
         zoomControl: true,
         center: [imageHeight/2, imageWidth/2],
        attributionControl: false
        zoom: -2
      });
 
      // Add the Agon map image as a tile layer
      var imageUrl = '/resources/assets/AgonBigMap.png';
      L.imageOverlay(imageUrl, bounds).addTo(map);
      map.fitBounds(bounds);
 
      // Fetch markers from semantic properties
      fetchMarkers(map);
    }
 
    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) {
    // Parse coordinates (assuming "X, Y" format)
    var parts = coords.split(',').map(function(s) { return parseFloat(s.trim()); });
    if (parts.length !== 2 || isNaN(parts[0]) || isNaN(parts[1])) return;
    var latlng = [parts[0], parts[1]];
      
      
     // Choose marker color based on type
     // Add the Agon map image as overlay
     var type = data['Location type'] && data['Location type'][0] ? data['Location type'][0] : 'Unknown';
     var bounds = [[0, 0], [imageHeight, imageWidth]];
     var color = getMarkerColor(type);
     L.imageOverlay(mw.config.get('wgScriptPath') + '/resources/assets/AgonBigMap.png', bounds).addTo(map);
 
   
     var marker = L.circleMarker(latlng, {
    // Fit map to bounds
      radius: 8,
     map.fitBounds(bounds);
      fillColor: color,
   
      color: '#0f1b2c',
    // Add scale
      weight: 2,
    L.control.scale().addTo(map);
      opacity: 1,
   
      fillOpacity: 0.8
     // Click to get coordinates
    }).addTo(map);
     map.on('click', function(e) {
 
        var coord = e.latlng;
     // Create popup content
        console.log('Clicked coordinates:', coord.lat.toFixed(2) + ', ' + coord.lng.toFixed(2));
     var popupContent = '<div class="marker-info">';
        L.popup()
    popupContent += '<h3>' + name + '</h3>';
            .setLatLng(e.latlng)
    popupContent += '<p><strong>Type:</strong> ' + type + '</p>';
            .setContent('Coordinates: ' + coord.lat.toFixed(2) + ', ' + coord.lng.toFixed(2))
            .openOn(map);
    });
      
      
     if (data['Mob type'] && data['Mob type'][0]) {
    // Load markers from page data
      popupContent += '<p><strong>Mobs:</strong> ' + data['Mob type'][0] + '</p>';
     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);
        });
     }
     }
    if (data['Has loot'] && data['Has loot'][0]) {
}
      popupContent += '<p><strong>Loot:</strong> ' + data['Has loot'][0] + '</p>';
    }
    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';
  }
})();

Revision as of 08:51, 25 January 2026

// Custom Agon World Map with Leaflet
(function() {
    // Only run on map pages
    if (!document.getElementById('agon-map-container')) return;
    
    // Load Leaflet CSS
    var link = document.createElement('link');
    link.rel = 'stylesheet';
    link.href = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.css';
    document.head.appendChild(link);
    
    // Load Leaflet JS
    var script = document.createElement('script');
    script.src = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.js';
    script.onload = function() {
        initAgonMap();
    };
    document.head.appendChild(script);
})();

function initAgonMap() {
    var mapContainer = document.getElementById('agon-map-container');
    if (!mapContainer) return;
    
    // Image dimensions
    var imageWidth = 16384;
    var imageHeight = 16384;
    
    // Create map with custom CRS for image coordinates
    var map = L.map('agon-map-container', {
        crs: L.CRS.Simple,
        minZoom: -3,
        maxZoom: 2,
        center: [imageHeight/2, imageWidth/2],
        zoom: -2
    });
    
    // Add the Agon map image as overlay
    var bounds = [[0, 0], [imageHeight, imageWidth]];
    L.imageOverlay(mw.config.get('wgScriptPath') + '/resources/assets/AgonBigMap.png', bounds).addTo(map);
    
    // Fit map to bounds
    map.fitBounds(bounds);
    
    // Add scale
    L.control.scale().addTo(map);
    
    // Click to get coordinates
    map.on('click', function(e) {
        var coord = e.latlng;
        console.log('Clicked coordinates:', coord.lat.toFixed(2) + ', ' + coord.lng.toFixed(2));
        L.popup()
            .setLatLng(e.latlng)
            .setContent('Coordinates: ' + coord.lat.toFixed(2) + ', ' + coord.lng.toFixed(2))
            .openOn(map);
    });
    
    // Load markers from page data
    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);
        });
    }
}