]> git.localhorst.tv Git - blank.git/commitdiff
less restrictive teleport command
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Wed, 16 Nov 2016 15:49:54 +0000 (16:49 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Wed, 16 Nov 2016 15:50:53 +0000 (16:50 +0100)
changed context requirements from player to entity

src/shared/CLIContext.hpp
src/shared/cli.cpp

index 5308bb2434146aa5d91e14263c3f5830491a0d03..e07571fc331eafbeff45100f712ab6204a648625 100644 (file)
@@ -7,18 +7,40 @@
 namespace blank {
 
 class Player;
+class Entity;
 
 class CLIContext {
 
 public:
-       explicit CLIContext(Player *p = nullptr)
-       : player(p) { }
+       /// Create context with optional player and entity
+       /// entity defaults to the player's if given
+       /// Associated player or entity can be changed during
+       /// the context's lifetime and will assume the original
+       /// values when reset.
+       explicit CLIContext(Player *p = nullptr, Entity *e = nullptr);
 
        /// check if this context associates a player
-       bool HasPlayer() { return player; }
+       bool HasPlayer() { return effective_player; }
        /// get the player responsible for all this
        /// only valid if HasPlayer() returns true
-       Player &GetPlayer() { return *player; }
+       Player &GetPlayer() { return *effective_player; }
+       /// change the effective player of this context
+       /// note that this will *not* change the effective entity
+       void SetPlayer(Player &p) { effective_player = &p; }
+
+       /// check if this context associates an entity
+       bool HasEntity() { return effective_entity; }
+       /// get the entity on which operations should be performed
+       /// only valid if HasPlayer() returns true
+       Entity &GetEntity() { return *effective_entity; }
+       /// change the effective player of this context
+       void SetEntity(Entity &e) { effective_entity = &e; }
+
+       /// reset effective player and entity to their original values
+       void Reset() {
+               effective_player = original_player;
+               effective_player = original_player;
+       }
 
        /// an error has happened and the player should be notified
        virtual void Error(const std::string &) = 0;
@@ -32,7 +54,10 @@ public:
        virtual void Broadcast(const std::string &) = 0;
 
 private:
-       Player *player;
+       Player *original_player;
+       Player *effective_player;
+       Entity *original_entity;
+       Entity *effective_entity;
 
 };
 
index cb46cfc264c289fcb73abb9b89caceaefd60af1e..bb4aa6de706e3259f25f374a9fdfe15d57808870 100644 (file)
@@ -63,19 +63,30 @@ CLI::Command::~Command() {
 }
 
 
+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();
+       }
+}
+
+
 void TeleportCommand::Execute(CLI &, CLIContext &ctx, TokenStreamReader &args) {
-       if (!ctx.HasPlayer()) {
-               ctx.Error("teleport needs player to operate on");
+       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());
 }