Bit modified version that is taking lot less CPU. Changed it so a 'block map' of a level is created and I reference that instead of loading the level each time and looking at it. Probably be better to use level.vars instead of a db_npc, but I can't get level vars to work for me properly. :/ Also haven't added gmap support for building block maps. Feel free to modify/add to the script if you want.
Now with this method you personally have to build the block map by saying a command on RC
RC Command
/npc blockmap <level_name.nw> <# of layers>
Use
onWall3( x, y, w, h);
Installation
In your Control-NPC add this :
PHP Code:
function onRCChat()
{
if ( params[ 0] == "blockmap")
{
if ( !levelExists( params[ 1]))
{
echo( "Control-NPC : Could not find" SPC params[ 1] @ "!");
return;
}
this.lvl = params[ 1];
this.layers = params[ 2];
temp.file_data.loadLines( "levels/" @ this.lvl);
echo( "Control-NPC : Building block map for" SPC this.lvl @ ".");
for ( temp.a : temp.file_data)
{
temp.tokens = temp.a.tokenize();
if ( temp.tokens[ 0] == "BOARD")
this.level_data.add( temp.tokens);
}
onStartCount();
}
}
function onStartCount()
{
for ( temp.b = 0; temp.b < 64; temp.b ++;) // width
{
temp.isBlocking = false;
for ( temp.a = 0; temp.a < this.layers; temp.a ++;) // layer
{
temp.tile_loc = getTileLocation( base64ToTile( this.level_data[ this.count + ( temp.a * 64)][ 5].substring( temp.b * 2, 2)));
if ( findLevel( "tiledata.nw").onwall( temp.tile_loc[ 0] % 64, temp.tile_loc[ 1] + ( 32 * ( temp.tile_loc[ 0] > 64? 1 : 0))))
{
temp.isBlocking = true;
break
}
}
temp.data0.add( temp.isBlocking);
}
this.data1.add( temp.data0);
if ( this.count < 63)
{
this.count ++;
scheduleEvent( 0.1, "onStartCount"); //Only way I could figure to avoid the maxlooplimit if you are doing several layers.
}
else
{
this.( @ "level_" @ this.lvl.substring( 0, this.lvl.length() - 3)) = this.data1;
echo( "Control-NPC : Block map for" SPC this.lvl @ ", has been built.");
this.count = this.data1 = this.layers = this.level_data = this.lvl = NULL;
}
}
function Base64ToTile( temp.t) // Big thank you to Dusty for this function
{
temp.base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
if ( temp.t.type() == 1)
{
return temp.base64.pos( temp.t.substring( 0, 1)) * 64 + temp.base64.pos( temp.t.substring( 1, 1));
}
else if ( temp.t.type() == 3)
{
temp.decodearray = new[ 0];
for ( temp.i : temp.t)
temp.decodearray.add( temp.base64.pos( temp.i.substring( 0, 1)) * 64 + temp.base64.pos( temp.i.substring( 1, 1)));
return temp.decodearray;
}
else
return -1;
}
function getTileLocation( temp.tileNum) //Returns tileset coordinate from decimal
{
temp.tileX = int( temp.tileNum / 512) * 16 + ( temp.tileNum % 16);
temp.tileY = int( temp.tileNum / 16) % 32;
return { temp.tileX, temp.tileY};
}
Next in a class put this.
PHP Code:
public function getPreciseLevelName() // Thank you cbk1994
{
if ( this.level.name.ends( ".gmap"))
return this.level.getmappartfile( this.x, this.y);
return this.level.name;
}
public function onWall3( temp.lvl_x, temp.lvl_y, temp.w, temp.h)
{
temp.check = findNPC( "Control-NPC").( "level_" @ getPreciseLevelName().substring( 0, getPreciseLevelName().length() - 3));
for ( temp.a = 0; temp.a < temp.h; temp.a ++;)
{
for ( temp.b = 0; temp.b < temp.w; temp.b ++;)
{
if ( temp.check[ temp.lvl_y + temp.a][ temp.lvl_x + temp.b] == 1)
return true;
}
}
return false;
}
Then in your baddie script or whatever, add the class with that script in it and just replace where ever you put onWall2, with onWall3.
I know this is more efficient due the /stats telling me, my baddie class CPU usage went from
1.784367163 % to
0.651127497 %. Although it does seem to spike from time to time. :/
e. May of had to do with other parts of the script for the high cpu usage, after rewriting a good portion to be cleaner and more efficient, the time is down to 0.063054958 %, but that is showing how efficient it is still.