Graal Forums

Graal Forums (https://forums.graalonline.com/forums/index.php)
-   Code Gallery (https://forums.graalonline.com/forums/forumdisplay.php?f=179)
-   -   Gmap boundary visualization (https://forums.graalonline.com/forums/showthread.php?t=134270318)

DustyPorViva 06-20-2016 05:31 PM

Gmap boundary visualization
 
1 Attachment(s)
Recently I was dealing with NPCs that relied on boundaries of their local level instead of the gmap and needed to know precisely where the boundaries of these levels were in relation to the gmap. So I wrote this up really quick. Figured it would be useful for others.

What it does is show the boundaries of every level on the gmap, along with the level name in each quadrant so you can know exactly what level you're in and what the adjacent levels are.

Attachment 55905

PHP Code:

//#CLIENTSIDE
const PIXEL 1/16;
const 
DITHER "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEB***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";
function 
onCreated() {
  
// Load dither pattern from base64 and save it as an image
  
temp.filename "levelgrid_dither.png";
  if (!
fileexists(temp.filename)) {
    
temp.file base64decode(DITHER);
    
temp.file.savestring(temp.filename0);
  }
}

function 
onPlayerEnters() {
  
this.ind 200// Initiate showimg index at 200
  
hideimgs(200,300);

  if (
player.gmap.name == null) return; // Only show on gmaps

  // Locations of all adjacent levels
  
temp.bounds = {
    {-
64,-64},{0,-64},{64,-64},
    {-
64},{0},{640},
    {-
6464},{064},{6464},
  };

  
// Detect proper level name
  
temp.level player.gmap == null player.level player.gmap;

  for (
temp.i=0;temp.i<temp.bounds.size();temp.i++) {
    
temp.px player.temp.bounds[temp.i][0];
    
temp.py player.temp.bounds[temp.i][1];

    
temp.int(temp.px/64)*64;
    
temp.int(temp.py/64)*64;

    
temp.lvl level.getmappartfile(temp.x+1,temp.y+1);

    
// Draw 4 dashed (white) line lines
    
temp.color = {255,255,255};
    
drawLine(200,{temp.x,temp.y},{temp.x+64,temp.y},PIXEL,temp.color,1);
    
drawLine(201,{temp.x,temp.y},{temp.x,temp.y+64},PIXEL,temp.color,1);
    
drawLine(202,{temp.x,temp.y+64-PIXEL},{temp.x+64,temp.y+64-PIXEL},PIXEL,temp.color,1);
    
drawLine(203,{temp.x+64-PIXEL,temp.y},{temp.x+64-PIXEL,temp.y+64},PIXEL,temp.color,1);

    
// Draw 4 dashed lines(blue) a pixel diagonally to the south-east for a shadow
    
temp.int(temp.px/64)*64 PIXEL;
    
temp.int(temp.py/64)*64 PIXEL;
    
temp.color = {8,10,252};

    
drawLine(204,{temp.x,temp.y},{temp.x+64,temp.y},PIXEL,temp.color,0);
    
drawLine(205,{temp.x,temp.y},{temp.x,temp.y+64},PIXEL,temp.color,0);
    
drawLine(206,{temp.x,temp.y+64-PIXEL},{temp.x+64,temp.y+64-PIXEL},PIXEL,temp.color,0);
    
drawLine(207,{temp.x+64-PIXEL,temp.y},{temp.x+64-PIXEL,temp.y+64},PIXEL,temp.color,0);
 
    
// Draw the level name in each corner of the quadrant
    
temp.texts = {
      {
.35     ,.15 32      ""},
      {
64 .35,.15 32      "r"},
      {
64 .3563 .15 32"r"},
      {
.35     63 .15 32""},
    };
    for (
temp.temp.texts) {
      
with (findimg(this.ind)) {
        
text temp.lvl;
        
temp.temp.j[0];
        
temp.temp.j[1];
        
32;
        
layer 0;
        
style temp.j[2];
        
zoom .5;
        
textshadow true;
        
font "verdana";
      }
      
this.ind++;
    }
  }
}

// Drawing a single polygon line does not allow you to apply a texture
// So instead we'll adapt Chompy's drawline function from: http://forums.graalonline.com/forums/showthread.php?t=78427
// This draws a line with a thickness, and 4 points, allowing a texture to be applied
// In this case, we use the dither image we generated to create a dashed-line effect
public function drawLine(indexxy1xy2thicknesscolorlay) {
  
with(findimg(this.ind)) {
    
dimension 3;
    
polygon = {
      
xy1[0], xy2[1] -32, -32,
      
xy2[0], xy1[1] -32, -32,
      
xy2[0]+thicknessxy1[1]+thickness -32, -32,
      
xy1[0]+thicknessxy2[1]+thickness -32, -32,
    };
    
red color[0]/255;
    
green color[1]/255;
    
blue color[2]/255;
    
alpha .99;

    
mode 1;
    
layer lay;

    
image "levelgrid_dither.png";
  }
  
this.ind++;



PlanetOscar 06-20-2016 07:43 PM

Looks awesome :)

maximus_asinus 06-20-2016 11:00 PM

Didn't realize you were still actively developing for Graal.

Also great tool, can think of a few situations where this would have been useful.

Sky 06-21-2016 05:56 AM

Nice, this could be very helpful on GK! Thanks, Dusty. :)


All times are GMT +2. The time now is 09:56 PM.

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.
Copyright (C) 1998-2019 Toonslab All Rights Reserved.