Vector3iSet GraspSet::intersection(const Vector3iSet& set1, const Vector3iSet& set2) const { if (set2.size() < set1.size()) { return intersection(set2, set1); } Vector3iSet set_out(set1.size()); for (Vector3iSet::const_iterator it = set1.begin(); it != set1.end(); it++) { if (set2.find(*it) != set2.end()) { set_out.insert(*it); } } return set_out; }
void cBlockPistonHandler::PushBlocks( const Vector3iSet & a_BlocksToPush, cWorld * a_World, const Vector3i & a_PushDir ) { // Sort blocks to move the blocks first, which are farest away from the piston // This prevents the overwriting of existing blocks std::vector<Vector3i> sortedBlocks(a_BlocksToPush.begin(), a_BlocksToPush.end()); std::sort(sortedBlocks.begin(), sortedBlocks.end(), [a_PushDir](const Vector3i & a, const Vector3i & b) { return a.Dot(a_PushDir) > b.Dot(a_PushDir); }); // Move every block BLOCKTYPE moveBlock; NIBBLETYPE moveMeta; for (auto & moveBlockPos : sortedBlocks) { a_World->GetBlockTypeMeta(moveBlockPos.x, moveBlockPos.y, moveBlockPos.z, moveBlock, moveMeta); a_World->SetBlock(moveBlockPos.x, moveBlockPos.y, moveBlockPos.z, E_BLOCK_AIR, 0); moveBlockPos += a_PushDir; if (cBlockInfo::IsPistonBreakable(moveBlock)) { // Block is breakable, drop it cBlockHandler * Handler = BlockHandler(moveBlock); if (Handler->DoesDropOnUnsuitable()) { cChunkInterface ChunkInterface(a_World->GetChunkMap()); cBlockInServerPluginInterface PluginInterface(*a_World); Handler->DropBlock(ChunkInterface, *a_World, PluginInterface, nullptr, moveBlockPos.x, moveBlockPos.y, moveBlockPos.z ); } } else { // Not breakable, just move it a_World->SetBlock(moveBlockPos.x, moveBlockPos.y, moveBlockPos.z, moveBlock, moveMeta); } } }