#include "CLI.hpp"
+#include "CLIContext.hpp"
#include "commands.hpp"
#include "../io/TokenStreamReader.hpp"
#include <iostream>
#include <sstream>
+#include <glm/gtx/io.hpp>
using namespace std;
commands[name] = cmd;
}
-void CLI::Execute(Player &player, const string &line) {
+void CLI::Execute(CLIContext &ctx, const string &line) {
stringstream s(line);
TokenStreamReader args(s);
if (!args.HasMore()) {
return;
}
if (args.Peek().type != Token::IDENTIFIER) {
- Error("I don't understand");
+ ctx.Error("I don't understand");
return;
}
string name;
args.ReadIdentifier(name);
auto entry = commands.find(name);
if (entry == commands.end()) {
- Error(name + ": command not found");
+ ctx.Error(name + ": command not found");
return;
}
try {
- entry->second->Execute(*this, player, args);
+ entry->second->Execute(*this, ctx, args);
} catch (exception &e) {
- Error(name + ": " + e.what());
+ ctx.Error(name + ": " + e.what());
} catch (...) {
- Error(name + ": unknown execution error");
+ ctx.Error(name + ": unknown execution error");
}
}
-void CLI::Message(const string &msg) {
- // TODO: display message to player
- cout << msg << endl;
-}
-
-void CLI::Error(const string &msg) {
- Message("CLI error: " + msg);
-}
-
CLI::Command::~Command() {
}
-void TeleportCommand::Execute(CLI &cli, Player &player, TokenStreamReader &args) {
+void TeleportCommand::Execute(CLI &cli, CLIContext &ctx, TokenStreamReader &args) {
glm::vec3 pos(args.GetFloat(), args.GetFloat(), args.GetFloat());
- glm::ivec3 chunk(pos);
- chunk /= Chunk::Extent();
- pos -= chunk;
- EntityState state = player.GetEntity().GetState();
- state.chunk_pos = chunk;
- state.block_pos = pos;
- player.GetEntity().SetState(state);
+ EntityState state = ctx.GetPlayer().GetEntity().GetState();
+ state.pos = ExactLocation(pos).Sanitize();
+ ctx.GetPlayer().GetEntity().SetState(state);
+
+ stringstream msg;
+ msg << ctx.GetPlayer().Name() << " teleported to " << pos;
+ ctx.Broadcast(msg.str());
}
}