Creation/Dev/Dungeon Generator/Cave Fix

From Graal Bible
Revision as of 19:16, 16 April 2011 by Cbk1994 (talk | contribs) (Created page with 'If you use the dungeon generator to generate caves for Graal Kingdoms, you will find that it is possible for fast pla…')
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

If you use the dungeon generator to generate caves for Graal Kingdoms, you will find that it is possible for fast players to glitch on top of the non-walkable space and then walk around on it.

The problem is that the tile definitions used for caves use a non-blocking selection of tiles for outside of the path.

To fix that, place this script in an NPC on your server and run it, being sure to change the GMAP name near the top:

function onCreated() {
  // you can use a level or a GMAP here, just make sure to
  // use the proper extension
  temp.levelToFix = findLevel("mycave.gmap");
  
  // don't change this
  if (levelToFix == null) {
    return echo("Error: Level doesn't exist!");
  }
  
  temp.tilesToChange = {
    {2560, 2818},
    {2561, 2819},
    {2562, 2820},
    {2563, 2821},
    {2576, 2834},
    {2577, 2835},
    {2578, 2836},
    {2579, 2837},
    {2592, 2850},
    {2593, 2851},
    {2594, 2852},
    {2595, 2853},
    {2608, 2866},
    {2609, 2867},
    {2610, 2868},
    {2611, 2869}
  };
  
  // create simple arrays
  temp.changeFrom = null;
  temp.changeTo = null;
  
  // avoid max loop limit
  temp.i = 0;
  this.avoidLimit = function(i) {
    if (i >= (this.maxlooplimit - 1)) {
      sleep(0.1);
      return 0;
    }
    
    return (++ i);
  };
  
  for (temp.tile : tilesToChange) {
    changeFrom.add(tile[0]);
    changeTo.add(tile[1]);
    
    i = this.avoidLimit(i);
  }
  
  // make changes
  for (temp.x = 0; x < levelToFix.width; x ++) {
    for (temp.y = 0; y < levelToFix.height; y ++) {
      temp.currentTile = levelToFix.tiles[x, y];
      temp.fixIndex = changeFrom.index(@ currentTile);
      
      if (fixIndex > (- 1)) {
        temp.newTile = changeTo[fixIndex];
        levelToFix.tiles[x, y] = newTile;
      }
      
      i = this.avoidLimit(i);
    }
    
    i = this.avoidLimit(i);
  }
  
  // save changes
  levelToFix.updateBoard2(0, 0, levelToFix.width, levelToFix.height);
}

Keep in mind that some players will see the old levels until the modified date is changed. To change the modified date so that all players see the fixed levels, download and reupload the modified levels.