public function onCmd(PlayerCommandPreprocessEvent $event)
 {
     if ($this->isRegistering()) {
         $event->setCancelled();
         $len = strlen($event->getMessage());
         $event->setMessage($hash = self::hash($event->getMessage(), $this->getUid()));
         if ($this->state === self::STATE_REGISTERING_FIRST) {
             $this->tmpHash = $hash;
             $this->sendCurlyLines();
             $this->send(Phrases::LOGIN_REGISTER_RETYPE);
             $this->state = self::STATE_REGISTERING_SECOND;
         } elseif ($this->state === self::STATE_REGISTERING_SECOND) {
             $this->sendCurlyLines();
             if ($this->tmpHash === $hash) {
                 $this->sendCurlyLines();
                 $this->setLoginDatum("hash", $hash);
                 $this->setLoginDatum("pwprefix", "~");
                 $this->setLoginDatum("pwlen", $len);
                 $this->state = self::STATE_PLAYING;
                 $this->sendFirstJoinMessages();
                 $this->login(self::AUTH_REG);
                 $this->send(Phrases::LOGIN_REGISTER_SUCCESS);
                 $this->saveData(Settings::STATUS_ONLINE);
             } else {
                 $this->send(Phrases::LOGIN_REGISTER_MISMATCH);
                 $this->tmpHash = null;
                 $this->state = self::STATE_REGISTERING_FIRST;
             }
         }
         return false;
     } elseif ($this->isLoggingIn()) {
         $msg = $event->getMessage();
         $hash = self::hash($msg, $this->getUid());
         $oldHash = self::oldHash($msg);
         $len = strlen($msg);
         $event->setMessage($hash);
         $this->sendCurlyLines();
         if ($hash === $this->getPasswordHash()) {
             $this->login(self::AUTH_PASS);
         } elseif ($this->isPortingOldPassword() and $oldHash === $this->getPasswordOldHash()) {
             $this->setLoginDatum("pwprefix", "~");
             $this->setLoginDatum("pwlen", $len);
             $this->setLoginDatum("hash", $hash);
             $this->setLoginDatum("oldhash", "");
             $this->login(self::AUTH_PASS);
             new UpdateHashesQuery($this->getMain(), $this->getUid(), $hash);
         } else {
             $this->state++;
             $chances = "chance";
             MUtils::word_quantitize($chances, 5 - $this->getStatePrecise());
             $this->send(Phrases::LOGIN_PASS_MISMATCH, ["chances" => $chances]);
             if ($this->getStatePrecise() === 5) {
                 $this->getPlayer()->kick("Failure to login within 5 attempts");
                 return false;
             }
         }
         return false;
     } else {
         $event->setMessage(TextFormat::clean($event->getMessage()));
         $msg = $event->getMessage();
         if (self::hash($msg, $this->getUid()) === $this->getPasswordHash()) {
             $this->send(Phrases::CHAT_BLOCKED_PASS);
             return false;
         }
         $len = $this->getLoginDatum("pwlen");
         $msgLen = strlen($msg);
         for ($i = 0; $i < $msgLen; $i++) {
             $substr = substr($msg, $i, $len);
             if (strlen($substr) < $len) {
                 break;
             }
             if ($this->getPasswordHash() === $this->hash($substr, $this->getUid())) {
                 $this->send(Phrases::CHAT_BLOCKED_PASS);
                 return false;
             }
         }
         $firstChar = substr($event->getMessage(), 0, 1);
         if ($firstChar === "\\") {
             $event->setMessage("/" . substr($event->getMessage(), 1));
         }
         if ($firstChar === "/") {
             $msg = $event->getMessage();
             if (strpos($msg, " ") === false) {
                 $cmd = $msg;
                 $postCmd = "";
             } else {
                 $cmd = strtolower(strstr($msg, " ", true));
                 $postCmd = strstr($msg, " ");
             }
             if ($cmd === "/w") {
                 $cmd = "/tell";
             }
             $event->setMessage($cmd . $postCmd);
             return true;
         }
         $target = $this->getQueryTarget();
         if ($target !== null) {
             fwrite($this->getMain()->pmLog, "|from:{$this->getPlayer()->getName()}|to:{$target->getPlayer()->getName()}|msg:{$msg}|" . PHP_EOL);
             $arrows = Phrases::VAR_info . "[" . $this->getPlayer()->getName() . " > " . $target->getPlayer()->getName() . "] " . Phrases::VAR_info . $msg;
             $target->getPlayer()->sendMessage($arrows);
             $this->getPlayer()->sendMessage($arrows);
             return false;
         }
         $this->setQueryTargetUid(null);
         $isLocal = $firstChar !== ".";
         if (!$isLocal) {
             $event->setMessage(substr($event->getMessage(), 1));
         }
         $message = trim($event->getMessage());
         if (!$this->spamDetector->censor($message)) {
             return false;
         }
         if ($this->currentChatState === self::CHANNEL_TEAM) {
             $data = ["tid" => $this->getTeamId(), "teamName" => $this->getTeamName(), "ign" => $this->getInGameName()];
             $type = Hormone::get($this->getMain(), Hormone::TEAM_CHAT, $this->getPlayer()->getDisplayName(), $message, $isLocal ? Settings::$LOCALIZE_CLASS : Settings::CLASS_ALL, $data);
             $type->release();
             return false;
         }
         if ($this->currentChatState !== self::CHANNEL_LOCAL) {
             $data = ["channel" => $this->currentChatState, "fromClass" => Settings::$LOCALIZE_CLASS, "ign" => $this->getInGameName()];
             $type = Hormone::get($this->getMain(), Hormone::CHANNEL_CHAT, $this->getPlayer()->getDisplayName(), $message, $isLocal ? Settings::$LOCALIZE_CLASS : Settings::CLASS_ALL, $data);
             $type->release();
             return false;
         }
         $this->onChat($message, $isLocal ? self::CHAT_NORMAL_LOCAL : self::CHAT_NORMAL_CLASS);
         return false;
     }
 }
 public function onCmd(PlayerCommandPreprocessEvent $event)
 {
     if ($this->isRegistering()) {
         $event->setCancelled();
         $len = strlen($event->getMessage());
         $event->setMessage($hash = self::hash($event->getMessage(), $this->getUid()));
         if ($this->state === self::STATE_REGISTERING_FIRST) {
             $this->tmpHash = $hash;
             $this->sendCurlyLines();
             $this->send(Phrases::LOGIN_REGISTER_RETYPE);
             $this->state = self::STATE_REGISTERING_SECOND;
         } elseif ($this->state === self::STATE_REGISTERING_SECOND) {
             $this->sendCurlyLines();
             if ($this->tmpHash === $hash) {
                 $this->sendCurlyLines();
                 $this->setLoginDatum("hash", $hash);
                 $this->setLoginDatum("pwprefix", "~");
                 $this->setLoginDatum("pwlen", $len);
                 $this->state = self::STATE_PLAYING;
                 $this->sendFirstJoinMessages();
                 $this->login(self::AUTH_REG);
                 $this->send(Phrases::LOGIN_REGISTER_SUCCESS);
             } else {
                 $this->send(Phrases::LOGIN_REGISTER_MISMATCH);
                 $this->tmpHash = null;
                 $this->state = self::STATE_REGISTERING_FIRST;
             }
         }
         return false;
     } elseif ($this->isLoggingIn()) {
         $event->setMessage($hash = self::hash($event->getMessage(), $this->getUid()));
         $this->sendCurlyLines();
         if ($hash === $this->getPasswordHash()) {
             $this->login(self::AUTH_PASS);
         } else {
             $this->state++;
             $chances = "chance";
             MUtils::word_quantitize($chances, 5 - $this->getStatePrecise());
             $this->send(Phrases::LOGIN_PASS_MISMATCH, ["chances" => $chances]);
             if ($this->getStatePrecise() === 5) {
                 $this->getPlayer()->kick("Failure to login within 5 attempts");
                 return false;
             }
         }
         return false;
     } else {
         $msg = $event->getMessage();
         $len = $this->getLoginDatum("pwlen");
         $msgLen = strlen($msg);
         for ($i = 0; $i < $msgLen; $i++) {
             $substr = substr($msg, $i, $len);
             if (strlen($substr) < $len) {
                 break;
             }
             if ($this->getPasswordHash() === $this->hash($substr, $this->getUid())) {
                 $this->send(Phrases::CHAT_BLOCKED_PASS);
                 return false;
             }
         }
         $firstChar = substr($event->getMessage(), 0, 1);
         if ($firstChar === "/") {
             return true;
         } elseif ($firstChar === "\\") {
             $event->setMessage("/" . substr($event->getMessage(), 1));
         }
         $isLocal = $firstChar !== ".";
         if (!$isLocal) {
             $event->setMessage(substr($event->getMessage(), 1));
         }
         $message = trim($event->getMessage());
         if (!$this->spamDetector->censor($message)) {
             return false;
         }
         if ($this->currentChatState === self::CHANNEL_TEAM) {
             $data = ["tid" => $this->getTeamId(), "teamName" => $this->getTeamName(), "ign" => $this->getInGameName()];
             $type = new TeamChatType($this->getMain(), $this->getPlayer()->getDisplayName(), $message, $isLocal ? Settings::$LOCALIZE_CLASS : Settings::CLASS_ALL, $data);
             $type->push();
             return false;
         }
         if ($this->currentChatState !== self::CHANNEL_LOCAL) {
             $data = ["channel" => $this->currentChatState, "fromClass" => Settings::$LOCALIZE_CLASS, "ign" => $this->getInGameName()];
             $type = new ChannelChatType($this->getMain(), $this->getPlayer()->getDisplayName(), $message, $isLocal ? Settings::$LOCALIZE_CLASS : Settings::CLASS_ALL, $data);
             $type->push();
             return false;
         }
         $this->onChat($message, $isLocal ? self::CHAT_LOCAL : self::CHAT_STD);
         return false;
     }
 }