The generator will be released publicly as soon as it's finished. =) If Zeblote's suggestion works, that would probably be the best option. For PTG however, I had to package functions for the hammer, the wand, the destructo wand and for killBrick. You could probably do something like this (hasn't been tested):
//When using the hammer, wand or destructo wand
function hammerimage::onHitObject(%this,%obj,%slot,%col,%d,%e,%f)
{
%parent = parent::onHitObject(%this,%obj,%slot,%col,%d,%e,%f);
if(%col.getClassName() !$= "fxDTSBrick")
return %parent;
else
{
if(%col.hasPathToGround() || (isObject(%col.getUpBrick(0)) && isObject(%col.getDownBrick(0))))
return parent::onHitObject(%this,%obj,%slot,%col,%d,%e,%f);
else if(!%col.removing)
{
//custom brick removal (also can just use "%col.delete();")
ServerPlay3D(brickBreakSound,%col.getPosition());
%col.fakeKillBrick(getRandom(-10,10) SPC getRandom(-10,10) SPC getRandom(0,10),3); //"0 0 8"
%col.removing = true; //prevents function from being spammed while brick is being removed
%col.schedule(500,delete);
return;
}
}
return %parent;
}
function wandimage::onHitObject(%this,%obj,%slot,%col,%d,%e,%f)
{
%parent = parent::onHitObject(%this,%obj,%slot,%col,%d,%e,%f);
if(%col.getClassName() !$= "fxDTSBrick")
return %parent;
else
{
if(!%col.willCauseChainKill() || %col.hasPathToGround())
return parent::onHitObject(%this,%obj,%slot,%col,%d,%e,%f);
else if(!%col.removing)
{
//custom brick removal (also can just use "%col.delete();")
ServerPlay3D(brickBreakSound,%col.getPosition());
%col.fakeKillBrick(getRandom(-10,10) SPC getRandom(-10,10) SPC getRandom(0,10),3); //"0 0 8"
%col.removing = true; //prevents function from being spammed while brick is being removed
%col.schedule(500,delete);
return;
}
}
return %parent;
}
function adminwandimage::onHitObject(%this,%obj,%slot,%col,%d,%e,%f)
{
%parent = parent::onHitObject(%this,%obj,%slot,%col,%d,%e,%f);
if(%col.getClassName() !$= "fxDTSBrick")
return %parent;
else
{
if(!%col.willCauseChainKill() || %col.hasPathToGround())
return parent::onHitObject(%this,%obj,%slot,%col,%d,%e,%f);
else if(!%col.removing)
{
//custom brick removal (also can just use "%col.delete();")
ServerPlay3D(brickBreakSound,%col.getPosition());
%col.fakeKillBrick(getRandom(-10,10) SPC getRandom(-10,10) SPC getRandom(0,10),3); //"0 0 8"
%col.removing = true; //prevents function from being spammed while brick is being removed
%col.schedule(500,delete);
return;
}
}
return %parent;
}
//When undoing bricks
function fxDTSBrick::killBrick(%this)
{
if(%this.willCauseChainKill() && !%this.hasPathToGround() && !%this.removing)
{
//custom brick removal (also can just use "%this.delete();")
ServerPlay3D(brickBreakSound,%this.getPosition());
%this.fakeKillBrick(getRandom(-10,10) SPC getRandom(-10,10) SPC getRandom(0,10),3); //"0 0 8"
%this.removing = true; //prevents function from being spammed while brick is being removed
%this.schedule(500,delete);
return;
}
parent::killBrick(%this);
}
The modified functions will check to see if a brick will cause a chainKill for the wand and destructo wand, and will delete the brick instead after playing the fakeKill animation. For the hammer, it'll also delete the brick with the fakeKill animation, but only if either the top, bottom or both sides of the brick are exposed; it's not a perfect solution, but it works fairly well.
If you wanted to still cause a chainKill, without destroying the supporting floating brick, that would be slightly more complicated. You would have to cycle through each above brick and delete it manually using the .getUpBrick(#) method (you might also have to cycle through down bricks as well, depending).