#include "../client.h" void command_nudge(Client *c, const Seperator *sep) { int arguments = sep->argnum; if (!arguments) { c->Message(Chat::White, "Usage: #nudge [x=float] [y=float] [z=float] [h=float]"); c->Message( Chat::White, fmt::format( "Note: Partial or mixed arguments allowed, example {}.", Saylink::Silent("#nudge x=5.0") ).c_str() ); return; } auto target = c->GetTarget(); if (!target) { c->Message(Chat::White, "You must have a target to use this command."); return; } if (target->IsMoving()) { c->Message(Chat::White, "This command requires a stationary target."); return; } glm::vec4 position_offset(0.0f, 0.0f, 0.0f, 0.0f); for (auto index = 1; index <= 4; ++index) { if (!sep->arg[index]) { continue; } Seperator argsep(sep->arg[index], '='); if (!argsep.arg[1][0]) { continue; } switch (argsep.arg[0][0]) { case 'x': position_offset.x = std::stof(argsep.arg[1]); break; case 'y': position_offset.y = std::stof(argsep.arg[1]); break; case 'z': position_offset.z = std::stof(argsep.arg[1]); break; case 'h': position_offset.w = std::stof(argsep.arg[1]); break; default: break; } } const auto& current_position = target->GetPosition(); glm::vec4 new_position( (current_position.x + position_offset.x), (current_position.y + position_offset.y), (current_position.z + position_offset.z), (current_position.w + position_offset.w) ); target->GMMove(new_position.x, new_position.y, new_position.z, new_position.w); c->Message( Chat::White, fmt::format( "Nudging {} to {:.2f}, {:.2f}, {:.2f}, {:.2f} with offsets of {:.2f}, {:.2f}, {:.2f}, {:.2f}.", c->GetTargetDescription(target), new_position.x, new_position.y, new_position.z, new_position.w, position_offset.x, position_offset.y, position_offset.z, position_offset.w ).c_str() ); }