int TileSource::getIndirectPowerLevelTo(int x, int y, int z, int side) {
    int id = getTile(x, y, z).id;
    if(Tile::solid[id] && id != 152) return getBlockPowerInput(x, y, z);
    if(id == 0) return 0;

    int (*getDirectSignal)(Tile*, TileSource*, int, int, int, int) = (int (*)(Tile*, TileSource*, int, int, int, int)) Tile::tiles[id]->vtable[VT_TILE_GETDIRECT];
    return getDirectSignal(Tile::tiles[id], this, x, y, z, side);
}
int RedstoneWireTile::getSignal(TileSource* region, int x, int y, int z, int side) {
	if(!wiresProvidePower) return 0;
	return getDirectSignal(region, x, y, z, side);
}
int NotGateTile::getSignal(NotGateTile* tile, TileSource* region, int x, int y, int z, int side) {
    if(side == 0) return getDirectSignal(tile, region, x, y, z, side);
    return 0;
}