#include "../io/TokenStreamReader.hpp"
#include "../world/Entity.hpp"
#include "../world/Player.hpp"
+#include "../world/World.hpp"
#include <iostream>
#include <sstream>
CLI::CLI(World &world)
: world(world)
, commands() {
+ AddCommand("as", new ImpersonateCommand);
AddCommand("tp", new TeleportCommand);
}
}
+CLIContext::CLIContext(Player *p, Entity *e)
+: original_player(p)
+, effective_player(p)
+, original_entity(e)
+, effective_entity(e) {
+ if (!e && p) {
+ original_entity = effective_entity = &p->GetEntity();
+ }
+}
+
+std::string CLIContext::Name() const {
+ if (HasPlayer()) return GetPlayer().Name();
+ if (HasEntity()) return GetEntity().Name();
+ return "anonymous";
+}
+
+
+void ImpersonateCommand::Execute(CLI &cli, CLIContext &ctx, TokenStreamReader &args) {
+ if (!args.HasMore()) {
+ // no argument => reset
+ ctx.Reset();
+ ctx.Broadcast(ctx.Name() + " returned to their own self");
+ return;
+ }
+ // TODO: broadcast who (real player name) impersonates who
+ string old_name = ctx.Name();
+ string name(args.GetString());
+
+ Player *p = cli.GetWorld().FindPlayer(name);
+ if (p) {
+ ctx.SetPlayer(*p);
+ ctx.SetEntity(p->GetEntity());
+ ctx.Broadcast(old_name + " now impersonating " + p->Name());
+ return;
+ }
+
+ // not a player, try an entity
+ Entity *e = cli.GetWorld().FindEntity(name);
+ if (e) {
+ ctx.SetEntity(*e);
+ ctx.Broadcast(old_name + " now impersonating " + e->Name());
+ return;
+ }
+
+ ctx.Error("no player or entity with name " + name);
+}
+
+
void TeleportCommand::Execute(CLI &, CLIContext &ctx, TokenStreamReader &args) {
+ if (!ctx.HasEntity()) {
+ ctx.Error("teleport needs entity to operate on");
+ return;
+ }
+
glm::vec3 pos(args.GetFloat(), args.GetFloat(), args.GetFloat());
- EntityState state = ctx.GetPlayer().GetEntity().GetState();
+ EntityState state = ctx.GetEntity().GetState();
state.pos = ExactLocation(pos).Sanitize();
- ctx.GetPlayer().GetEntity().SetState(state);
+ ctx.GetEntity().SetState(state);
stringstream msg;
- msg << ctx.GetPlayer().Name() << " teleported to " << pos;
+ msg << ctx.GetEntity().Name() << " teleported to " << pos;
ctx.Broadcast(msg.str());
}