diff --git a/include/core/map.h b/include/core/map.h index 156ca996..f05e6acb 100644 --- a/include/core/map.h +++ b/include/core/map.h @@ -81,6 +81,7 @@ public: void cacheCollision(); bool getBlock(int x, int y, Block *out); void setBlock(int x, int y, Block block, bool enableScriptCallback = false); + void setBlockdata(Blockdata blockdata); void floodFillCollisionElevation(int x, int y, uint16_t collision, uint16_t elevation); void _floodFillCollisionElevation(int x, int y, uint16_t collision, uint16_t elevation); void magicFillCollisionElevation(int x, int y, uint16_t collision, uint16_t elevation); diff --git a/src/core/editcommands.cpp b/src/core/editcommands.cpp index 0d012b3a..c9929503 100644 --- a/src/core/editcommands.cpp +++ b/src/core/editcommands.cpp @@ -49,7 +49,7 @@ void PaintMetatile::redo() { if (!map) return; - map->layout->blockdata = newMetatiles; + map->setBlockdata(newMetatiles); map->layout->lastCommitMapBlocks.blocks = map->layout->blockdata; @@ -59,7 +59,7 @@ void PaintMetatile::redo() { void PaintMetatile::undo() { if (!map) return; - map->layout->blockdata = oldMetatiles; + map->setBlockdata(oldMetatiles); map->layout->lastCommitMapBlocks.blocks = map->layout->blockdata; @@ -139,7 +139,7 @@ void ShiftMetatiles::redo() { if (!map) return; - map->layout->blockdata = newMetatiles; + map->setBlockdata(newMetatiles); map->layout->lastCommitMapBlocks.blocks = map->layout->blockdata; @@ -149,7 +149,7 @@ void ShiftMetatiles::redo() { void ShiftMetatiles::undo() { if (!map) return; - map->layout->blockdata = oldMetatiles; + map->setBlockdata(oldMetatiles); map->layout->lastCommitMapBlocks.blocks = map->layout->blockdata; @@ -209,7 +209,7 @@ void ResizeMap::redo() { if (!map) return; - map->layout->blockdata = newMetatiles; + map->setBlockdata(newMetatiles); map->setDimensions(newMapWidth, newMapHeight, false); map->layout->border = newBorder; @@ -223,7 +223,7 @@ void ResizeMap::redo() { void ResizeMap::undo() { if (!map) return; - map->layout->blockdata = oldMetatiles; + map->setBlockdata(oldMetatiles); map->setDimensions(oldMapWidth, oldMapHeight, false); map->layout->border = oldBorder; @@ -510,7 +510,7 @@ void ScriptEditMap::redo() { if (!map) return; - map->layout->blockdata = newMetatiles; + map->setBlockdata(newMetatiles); if (newMapWidth != map->getWidth() || newMapHeight != map->getHeight()) { map->setDimensions(newMapWidth, newMapHeight, false); } @@ -524,7 +524,7 @@ void ScriptEditMap::redo() { void ScriptEditMap::undo() { if (!map) return; - map->layout->blockdata = oldMetatiles; + map->setBlockdata(oldMetatiles); if (oldMapWidth != map->getWidth() || oldMapHeight != map->getHeight()) { map->setDimensions(oldMapWidth, oldMapHeight, false); } diff --git a/src/core/map.cpp b/src/core/map.cpp index 8cf47675..bdacd3f1 100644 --- a/src/core/map.cpp +++ b/src/core/map.cpp @@ -354,6 +354,19 @@ void Map::setBlock(int x, int y, Block block, bool enableScriptCallback) { } } +void Map::setBlockdata(Blockdata blockdata) { + int width = getWidth(); + int size = qMin(blockdata.size(), layout->blockdata.size()); + for (int i = 0; i < size; i++) { + Block prevBlock = layout->blockdata.at(i); + Block newBlock = blockdata.at(i); + if (prevBlock != newBlock) { + layout->blockdata.replace(i, newBlock); + Scripting::cb_MetatileChanged(i % width, i / width, prevBlock, newBlock); + } + } +} + void Map::_floodFillCollisionElevation(int x, int y, uint16_t collision, uint16_t elevation) { QList todo; todo.append(QPoint(x, y));