diff --git a/common/string_util.cpp b/common/string_util.cpp index f0a42b91d..a770ce202 100644 --- a/common/string_util.cpp +++ b/common/string_util.cpp @@ -15,6 +15,7 @@ */ #include "string_util.h" +#include #include #include @@ -1019,3 +1020,146 @@ std::vector GetBadWords() "zoophilia" }; } + +std::string ConvertSecondsToTime(int duration) +{ + int timer_length = duration; + int days = int(timer_length / 86400000); + timer_length %= 86400000; + int hours = int(timer_length / 3600); + timer_length %= 3600; + int minutes = int(timer_length / 60); + timer_length %= 60; + int seconds = timer_length; + std::string time_string = "Unknown"; + std::string day_string = (days == 1 ? "Day" : "Days"); + std::string hour_string = (hours == 1 ? "Hour" : "Hours"); + std::string minute_string = (minutes == 1 ? "Minute" : "Minutes"); + std::string second_string = (seconds == 1 ? "Second" : "Seconds"); + if (days && hours && minutes && seconds) { // DHMS + time_string = fmt::format( + "{} {}, {} {}, {} {}, and {} {}", + days, + day_string, + hours, + hour_string, + minutes, + minute_string, + seconds, + second_string + ); + } else if (days && hours && minutes && !seconds) { // DHM + time_string = fmt::format( + "{} {}, {} {}, and {} {}", + days, + day_string, + hours, + hour_string, + minutes, + minute_string + ); + } else if (days && hours && !minutes && seconds) { // DHS + time_string = fmt::format( + "{} {}, {} {}, and {} {}", + days, + day_string, + hours, + hour_string, + seconds, + second_string + ); + } else if (days && hours && !minutes && !seconds) { // DH + time_string = fmt::format( + "{} {} and {} {}", + days, + day_string, + hours, + hour_string + ); + } else if (days && !hours && minutes && seconds) { // DMS + time_string = fmt::format( + "{} {}, {} {}, and {} {}", + days, + day_string, + minutes, + minute_string, + seconds, + second_string + ); + } else if (days && !hours && minutes && !seconds) { // DM + time_string = fmt::format( + "{} {} and {} {}", + days, + day_string, + minutes, + minute_string + ); + } else if (days && !hours && !minutes && seconds) { // DS + time_string = fmt::format( + "{} {} and {} {}", + days, + day_string, + seconds, + second_string + ); + } else if (days && !hours && !minutes && !seconds) { // D + time_string = fmt::format( + "{} {}", + days, + day_string + ); + } else if (!days && hours && minutes && seconds) { // HMS + time_string = fmt::format( + "{} {}, {} {}, and {} {}", + hours, + hour_string, + minutes, + minute_string, + seconds, + second_string + ); + } else if (!days && hours && minutes && !seconds) { // HM + time_string = fmt::format( + "{} {} and {} {}", + hours, + hour_string, + minutes, + minute_string + ); + } else if (!days && hours && !minutes && seconds) { // HS + time_string = fmt::format( + "{} {} and {} {}", + hours, + hour_string, + seconds, + second_string + ); + } else if (!days && hours && !minutes && !seconds) { // H + time_string = fmt::format( + "{} {}", + hours, + hour_string + ); + } else if (!days && !hours && minutes && seconds) { // MS + time_string = fmt::format( + "{} {} and {} {}", + minutes, + minute_string, + seconds, + second_string + ); + } else if (!days && !hours && minutes && !seconds) { // M + time_string = fmt::format( + "{} {}", + minutes, + minute_string + ); + } else if (!days && !hours && !minutes && seconds) { // S + time_string = fmt::format( + "{} {}", + seconds, + second_string + ); + } + return time_string; +} diff --git a/common/string_util.h b/common/string_util.h index 0353c5c98..07b5ef5d0 100644 --- a/common/string_util.h +++ b/common/string_util.h @@ -45,6 +45,7 @@ std::vector wrap(std::vector &src, std::string charact std::string implode(std::string glue, std::vector src); std::string convert2digit(int n, std::string suffix); std::string numberToWords(unsigned long long int n); +std::string ConvertSecondsToTime(int duration); // For converstion of numerics into English // Used for grid nodes, as NPC names remove numerals. diff --git a/zone/command.cpp b/zone/command.cpp index 16ee02d55..066062d2a 100755 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -9291,21 +9291,62 @@ void command_setcrystals(Client *c, const Seperator *sep) void command_stun(Client *c, const Seperator *sep) { - Mob *t=c->CastToMob(); - uint32 duration; - - if(sep->arg[1][0]) - { - duration = atoi(sep->arg[1]); - if(c->GetTarget()) - t=c->GetTarget(); - if(t->IsClient()) - t->CastToClient()->Stun(duration); - else - t->CastToNPC()->Stun(duration); + int arguments = sep->argnum; + if (!arguments || !sep->IsNumber(1)) { + c->Message(Chat::White, "Usage: #stun [Duration]"); + return; } - else - c->Message(Chat::White, "Usage: #stun [duration]"); + + Mob* target = c; + int duration = static_cast(std::min(std::stoll(sep->arg[1]), (long long) 2000000000)); + + if (duration < 0) { + duration = 0; + } + + if (c->GetTarget()) { + target = c->GetTarget(); + if (target->IsClient()) { + target->CastToClient()->Stun(duration); + } else if (target->IsNPC()) { + target->CastToNPC()->Stun(duration); + } + } else { + c->Stun(duration); + } + + std::string stun_message = ( + duration ? + fmt::format( + "You stunned {} for {}.", + ( + c == target ? + "yourself" : + fmt::format( + "{} ({})", + target->GetCleanName(), + target->GetID() + ) + ), + ConvertSecondsToTime(duration) + ) : + fmt::format( + "You unstunned {}.", + ( + c == target ? + "yourself" : + fmt::format( + "{} ({})", + target->GetCleanName(), + target->GetID() + ) + ) + ) + ); + c->Message( + Chat::White, + stun_message.c_str() + ); } diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index b7a8976fb..18431e47b 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -3353,32 +3353,7 @@ EQ::ItemInstance *QuestManager::CreateItem(uint32 item_id, int16 charges, uint32 } std::string QuestManager::secondstotime(int duration) { - int timer_length = duration; - int hours = int(timer_length / 3600); - timer_length %= 3600; - int minutes = int(timer_length / 60); - timer_length %= 60; - int seconds = timer_length; - std::string time_string = "Unknown"; - std::string hour_string = (hours == 1 ? "Hour" : "Hours"); - std::string minute_string = (minutes == 1 ? "Minute" : "Minutes"); - std::string second_string = (seconds == 1 ? "Second" : "Seconds"); - if (hours > 0 && minutes > 0 && seconds > 0) { - time_string = fmt::format("{} {}, {} {}, and {} {}", hours, hour_string, minutes, minute_string, seconds, second_string); - } else if (hours > 0 && minutes > 0 && seconds == 0) { - time_string = fmt::format("{} {} and {} {}", hours, hour_string, minutes, minute_string); - } else if (hours > 0 && minutes == 0 && seconds > 0) { - time_string = fmt::format("{} {} and {} {}", hours, hour_string, seconds, second_string); - } else if (hours > 0 && minutes == 0 && seconds == 0) { - time_string = fmt::format("{} {}", hours, hour_string); - } else if (hours == 0 && minutes > 0 && seconds > 0) { - time_string = fmt::format("{} {} and {} {}", minutes, minute_string, seconds, second_string); - } else if (hours == 0 && minutes > 0 && seconds == 0) { - time_string = fmt::format("{} {}", minutes, minute_string); - } else if (hours == 0 && minutes == 0 && seconds > 0) { - time_string = fmt::format("{} {}", seconds, second_string); - } - return time_string; + return ConvertSecondsToTime(duration); } std::string QuestManager::gethexcolorcode(std::string color_name) {