It's slow because you're sending a trigger for every tile.
It'd be faster if you just built the list of tiles that need to be changed, looped through the list altering each tile as required as well as find the top-left and bottom-right most tiles in the process, and updated the resulting rectangle.
Edit: This was fun.
PHP Code:
//#CLIENTSIDE
function onMouseDown() {
floodFill(int(mousex), int(mousey));
}
// Flooding Fill (Works better)
function floodFill(tx, ty) {
temp.queue.add({tx, ty});
temp.tile = player.level.tiles[tx, ty];
maxlooplimit = 100000;
while (temp.queue.size() > 0) {
tx = temp.queue[0][0];
ty = temp.queue[0][1];
temp.queue.delete(0);
for (temp.i = 0; temp.i < 4; temp.i++) {
temp.nx = tx + vecx(temp.i);
temp.ny = ty + vecy(temp.i);
if (checkTile(nx, ny, temp.tile)) {
if (!((@{nx, ny}) in temp.queue)) {
temp.queue.add({nx, ny});
}
}
}
floodTile(tx, ty);
}
}
// West-to-East then North-to-South method.
function floodFill2(tx, ty) {
temp.queue.add({tx, ty});
temp.tile = player.level.tiles[tx, ty];
maxlooplimit = 100000;
while (temp.queue.size() > 0) {
tx = temp.queue[0][0];
ty = temp.queue[0][1];
temp.queue.delete(0);
temp.west = tx - 1;
while (checkTile(west, ty, temp.tile)) {
temp.west--;
}
temp.east = tx + 1;
while (checkTile(east, ty, temp.tile)) {
temp.east++;
}
for (temp.tx = temp.west + 1; temp.tx < temp.east; temp.tx++) {
if (checkTile(tx, ty, temp.tile)) {
floodTile(tx, ty);
}
if (checkTile(tx, ty - 1, temp.tile)) {
temp.queue.add({tx, ty - 1});
}
if (checkTile(tx, ty + 1, temp.tile)) {
temp.queue.add({tx, ty + 1});
}
}
}
}
function checkTile(tx, ty, tile) {
if (tx in |0,64| && ty in |0,64|) {
if (player.level.tiles[tx, ty] == tile) return true;
}
return false;
}
function floodTile(tx, ty, nosleep) {
player.level.tiles[tx, ty] = 322;
updateboard(tx, ty, 1, 1);
if (!nosleep) sleep(0.05);
}