void HousePalettePanel::OnListBoxDoubleClick(wxCommandEvent& event) { House* house = reinterpret_cast<House*>(event.GetClientData()); // I find it extremly unlikely that one actually wants the exit at 0,0,0, so just treat it as the null value if(house && house->getExit() != Position(0,0,0)) { gui.CenterOnPosition(house->getExit()); } }
void Action::undo(DirtyList* dirty_list) { if(changes.empty()) return; editor.selection.start(Selection::INTERNAL); ChangeList::reverse_iterator it = changes.rbegin(); while(it != changes.rend()) { Change* c = *it; switch(c->type) { case CHANGE_TILE: { void** data = &c->data; Tile* oldtile = reinterpret_cast<Tile*>(*data); ASSERT(oldtile); Position pos = oldtile->getPosition(); if(editor.IsLiveClient()) { QTreeNode* nd = editor.map.getLeaf(pos.x, pos.y); if(!nd || !nd->isVisible(pos.z > 7)) { // Delete all changes that affect tiles outside our view c->clear(); ++it; continue; } } Tile* newtile = editor.map.swapTile(pos, oldtile); // Update server side change list (for broadcast) if(editor.IsLiveServer() && dirty_list) dirty_list->AddPosition(pos.x, pos.y, pos.z); if(oldtile->isSelected()) editor.selection.addInternal(oldtile); if(newtile->isSelected()) editor.selection.removeInternal(newtile); if(newtile->getHouseID() != oldtile->getHouseID()) { // oooooomggzzz we need to remove it from the appropriate house! House* house = editor.map.houses.getHouse(newtile->getHouseID()); if(house) { house->removeTile(newtile); } else { // Set tile house to 0, house has been removed newtile->setHouse(nullptr); } house = editor.map.houses.getHouse(oldtile->getHouseID()); if(house) { house->addTile(oldtile); } } if(oldtile->spawn) { if(newtile->spawn) { if(*oldtile->spawn != *newtile->spawn) { editor.map.removeSpawn(newtile); editor.map.addSpawn(oldtile); } } else { editor.map.addSpawn(oldtile); } } else if(newtile->spawn) { editor.map.removeSpawn(newtile); } *data = newtile; // Update client dirty list if(editor.IsLiveClient() && dirty_list && type != ACTION_REMOTE) { // Local action, assemble changes dirty_list->AddChange(c); } } break; case CHANGE_MOVE_HOUSE_EXIT: { std::pair<uint32_t, Position>* p = reinterpret_cast<std::pair<uint32_t, Position>* >(c->data); ASSERT(p); House* whathouse = editor.map.houses.getHouse(p->first); if(whathouse) { Position oldpos = whathouse->getExit(); whathouse->setExit(p->second); p->second = oldpos; } } break; case CHANGE_MOVE_WAYPOINT: { std::pair<std::string, Position>* p = reinterpret_cast<std::pair<std::string, Position>* >(c->data); ASSERT(p); Waypoint* wp = editor.map.waypoints.getWaypoint(p->first); if(wp) { // Change the tiles TileLocation* oldtile = editor.map.getTileL(wp->pos); TileLocation* newtile = editor.map.getTileL(p->second); // Only need to remove from old if it actually exists if(p->second != Position()) if(oldtile && oldtile->getWaypointCount() > 0) oldtile->decreaseWaypointCount(); newtile->increaseWaypointCount(); // Update shit Position oldpos = wp->pos; wp->pos = p->second; p->second = oldpos; } } break; default: break; } ++it; } editor.selection.finish(Selection::INTERNAL); commited = false; }
void Action::commit(DirtyList* dirty_list) { editor.selection.start(Selection::INTERNAL); ChangeList::const_iterator it = changes.begin(); while(it != changes.end()) { Change* c = *it; switch(c->type) { case CHANGE_TILE: { void** data = &c->data; Tile* newtile = reinterpret_cast<Tile*>(*data); ASSERT(newtile); Position pos = newtile->getPosition(); if(editor.IsLiveClient()) { QTreeNode* nd = editor.map.getLeaf(pos.x, pos.y); if(!nd || !nd->isVisible(pos.z > 7)) { // Delete all changes that affect tiles outside our view c->clear(); ++it; continue; } } Tile* oldtile = editor.map.swapTile(pos, newtile); TileLocation* location = newtile->getLocation(); // Update other nodes in the network if(editor.IsLiveServer() && dirty_list) dirty_list->AddPosition(pos.x, pos.y, pos.z); newtile->update(); //std::cout << "\tSwitched tile at " << pos.x << ";" << pos.y << ";" << pos.z << " from " << (void*)oldtile << " to " << *data << std::endl; if(newtile->isSelected()) editor.selection.addInternal(newtile); if(oldtile) { if(newtile->getHouseID() != oldtile->getHouseID()) { // oooooomggzzz we need to add it to the appropriate house! House* house = editor.map.houses.getHouse(oldtile->getHouseID()); if(house) house->removeTile(oldtile); house = editor.map.houses.getHouse(newtile->getHouseID()); if(house) house->addTile(newtile); } if(oldtile->spawn) { if(newtile->spawn) { if(*oldtile->spawn != *newtile->spawn) { editor.map.removeSpawn(oldtile); editor.map.addSpawn(newtile); } } else { // Spawn has been removed editor.map.removeSpawn(oldtile); } } else if(newtile->spawn) { editor.map.addSpawn(newtile); } //oldtile->update(); if(oldtile->isSelected()) editor.selection.removeInternal(oldtile); *data = oldtile; } else { *data = editor.map.allocator(location); if(newtile->getHouseID() != 0) { // oooooomggzzz we need to add it to the appropriate house! House* house = editor.map.houses.getHouse(newtile->getHouseID()); if(house) { house->addTile(newtile); } } if(newtile->spawn) editor.map.addSpawn(newtile); } // Mark the tile as modified newtile->modify(); // Update client dirty list if(editor.IsLiveClient() && dirty_list && type != ACTION_REMOTE) { // Local action, assemble changes dirty_list->AddChange(c); } } break; case CHANGE_MOVE_HOUSE_EXIT: { std::pair<uint32_t, Position>* p = reinterpret_cast<std::pair<uint32_t, Position>* >(c->data); ASSERT(p); House* whathouse = editor.map.houses.getHouse(p->first); if(whathouse) { Position oldpos = whathouse->getExit(); whathouse->setExit(p->second); p->second = oldpos; } } break; case CHANGE_MOVE_WAYPOINT: { std::pair<std::string, Position>* p = reinterpret_cast<std::pair<std::string, Position>* >(c->data); ASSERT(p); Waypoint* wp = editor.map.waypoints.getWaypoint(p->first); if(wp) { // Change the tiles TileLocation* oldtile = editor.map.getTileL(wp->pos); TileLocation* newtile = editor.map.getTileL(p->second); // Only need to remove from old if it actually exists if(p->second != Position()) if(oldtile && oldtile->getWaypointCount() > 0) oldtile->decreaseWaypointCount(); newtile->increaseWaypointCount(); // Update shit Position oldpos = wp->pos; wp->pos = p->second; p->second = oldpos; } } break; default: break; } ++it; } editor.selection.finish(Selection::INTERNAL); commited = true; }