From 8155ec671581b051feca4187d5067ddbd149b387 Mon Sep 17 00:00:00 2001 From: Kae <80987908+Novaenia@users.noreply.github.com> Date: Sat, 14 Sep 2024 15:59:01 +1000 Subject: protected dungeon ID optimization + /settileprotection improvements --- source/game/StarCommandProcessor.cpp | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) (limited to 'source/game/StarCommandProcessor.cpp') diff --git a/source/game/StarCommandProcessor.cpp b/source/game/StarCommandProcessor.cpp index b5beb20..7b6915e 100644 --- a/source/game/StarCommandProcessor.cpp +++ b/source/game/StarCommandProcessor.cpp @@ -262,16 +262,33 @@ String CommandProcessor::setTileProtection(ConnectionId connectionId, String con return "Not enough arguments to /settileprotection. Use /settileprotection "; try { - DungeonId dungeonId = lexicalCast(arguments.at(0)); - bool isProtected = lexicalCast(arguments.at(1)); - - bool done = m_universe->executeForClient(connectionId, [dungeonId, isProtected](WorldServer* world, PlayerPtr const&) { - world->setTileProtection(dungeonId, isProtected); - }); - - return done ? "" : "Failed to set block protection."; + bool isProtected = lexicalCast(arguments.takeLast()); + List dungeonIds; + for (auto& banana : arguments) { + auto slices = banana.split(".."); + auto it = slices.begin(); + DungeonId previous = 0; + while (it != slices.end()) { + DungeonId current = lexicalCast(*it); + dungeonIds.append(current); + if (it++ != slices.begin() && previous != current) { + if (current < previous) swap(previous, current); + for (DungeonId id = previous + 1; id != current; ++id) + dungeonIds.append(id); + } + previous = current; + } + } + size_t changed = 0; + if (!m_universe->executeForClient(connectionId, [&](WorldServer* world, PlayerPtr const&) { + changed = world->setTileProtection(dungeonIds, isProtected); + })) { + return "Invalid client state"; + } + String output = strf("{} {} dungeon IDs", isProtected ? "Protected" : "Unprotected", changed); + return changed < dungeonIds.size() ? strf("{} ({} unchanged)", output, dungeonIds.size() - changed) : output; } catch (BadLexicalCast const&) { - return strf("Could not parse /settileprotection parameters. Use /settileprotection ", argumentString); + return strf("Could not parse /settileprotection parameters. Use /settileprotection ", argumentString); } } -- cgit v1.2.3