diff --git a/src/client.h b/src/client.h index 963eb6702..1a7ef924a 100644 --- a/src/client.h +++ b/src/client.h @@ -270,6 +270,12 @@ public: void addChatMessage(const std::wstring &message) { + if (message[0] == L'/') { + m_chat_queue.push_back( + (std::wstring)L"issued command: "+message); + return; + } + //JMutexAutoLock envlock(m_env_mutex); //bulk comment-out LocalPlayer *player = m_env.getLocalPlayer(); assert(player != NULL); diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 265997857..8438bf4f5 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -39,6 +39,7 @@ void set_default_settings() g_settings.setDefault("keymap_sneak", "KEY_LSHIFT"); g_settings.setDefault("keymap_inventory", "KEY_KEY_I"); g_settings.setDefault("keymap_chat", "KEY_KEY_T"); + g_settings.setDefault("keymap_cmd", "/"); g_settings.setDefault("keymap_rangeselect", "KEY_KEY_R"); g_settings.setDefault("keymap_freemove", "KEY_KEY_K"); g_settings.setDefault("keymap_fastmove", "KEY_KEY_J"); diff --git a/src/game.cpp b/src/game.cpp index 7bf1c6f5c..7c77996b8 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -114,18 +114,6 @@ struct TextDestChat : public TextDest // Discard empty line if(text == L"") return; - - // Parse command (server command starts with "/#") - if(text[0] == L'/' && text[1] != L'#') - { - std::wstring reply = L"Local: "; - - reply += L"Local commands not yet supported. " - L"Server prefix is \"/#\"."; - - m_client->addChatMessage(reply); - return; - } // Send to others m_client->sendChatMessage(text); @@ -1332,6 +1320,14 @@ void the_game( &g_menumgr, dest, L""))->drop(); } + else if(input->wasKeyDown(getKeySetting("keymap_cmd"))) + { + TextDest *dest = new TextDestChat(&client); + + (new GUITextInputMenu(guienv, guiroot, -1, + &g_menumgr, dest, + L"/"))->drop(); + } else if(input->wasKeyDown(getKeySetting("keymap_freemove"))) { if(g_settings.getBool("free_move")) diff --git a/src/guiKeyChangeMenu.cpp b/src/guiKeyChangeMenu.cpp index 5968d5c12..d6de11493 100644 --- a/src/guiKeyChangeMenu.cpp +++ b/src/guiKeyChangeMenu.cpp @@ -226,6 +226,21 @@ void GUIKeyChangeMenu::regenerateGui(v2u32 screensize) this->chat = Environment->addButton(rect, this, GUI_ID_KEY_CHAT_BUTTON, wgettext(key_chat.name())); } + offset += v2s32(0, 25); + { + core::rect < s32 > rect(0, 0, 100, 20); + rect += topleft + v2s32(offset.X, offset.Y); + Environment->addStaticText(wgettext("Command"), rect, false, true, this, -1); + //t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT); + } + + { + core::rect < s32 > rect(0, 0, 100, 30); + rect += topleft + v2s32(offset.X + 105, offset.Y - 5); + this->cmd = Environment->addButton(rect, this, GUI_ID_KEY_CMD_BUTTON, + wgettext(key_cmd.name())); + } + //next col offset = v2s32(250, 40); @@ -333,6 +348,7 @@ bool GUIKeyChangeMenu::acceptInput() g_settings.set("keymap_sneak", key_sneak.sym()); g_settings.set("keymap_inventory", key_inventory.sym()); g_settings.set("keymap_chat", key_chat.sym()); + g_settings.set("keymap_cmd", key_cmd.sym()); g_settings.set("keymap_rangeselect", key_range.sym()); g_settings.set("keymap_freemove", key_fly.sym()); g_settings.set("keymap_fastmove", key_fast.sym()); @@ -351,6 +367,7 @@ void GUIKeyChangeMenu::init_keys() key_sneak = getKeySetting("keymap_sneak"); key_inventory = getKeySetting("keymap_inventory"); key_chat = getKeySetting("keymap_chat"); + key_cmd = getKeySetting("keymap_cmd"); key_range = getKeySetting("keymap_rangeselect"); key_fly = getKeySetting("keymap_freemove"); key_fast = getKeySetting("keymap_fastmove"); @@ -391,6 +408,9 @@ bool GUIKeyChangeMenu::resetMenu() case GUI_ID_KEY_CHAT_BUTTON: this->chat->setText(wgettext(key_chat.name())); break; + case GUI_ID_KEY_CMD_BUTTON: + this->cmd->setText(wgettext(key_cmd.name())); + break; case GUI_ID_KEY_RANGE_BUTTON: this->range->setText(wgettext(key_range.name())); break; @@ -460,6 +480,11 @@ bool GUIKeyChangeMenu::OnEvent(const SEvent& event) this->chat->setText(wgettext(kp.name())); this->key_chat = kp; } + else if (activeKey == GUI_ID_KEY_CMD_BUTTON) + { + this->cmd->setText(wgettext(kp.name())); + this->key_cmd = kp; + } else if (activeKey == GUI_ID_KEY_RANGE_BUTTON) { this->range->setText(wgettext(kp.name())); @@ -564,6 +589,11 @@ bool GUIKeyChangeMenu::OnEvent(const SEvent& event) activeKey = event.GUIEvent.Caller->getID(); this->chat->setText(wgettext("press Key")); break; + case GUI_ID_KEY_CMD_BUTTON: + resetMenu(); + activeKey = event.GUIEvent.Caller->getID(); + this->cmd->setText(wgettext("press Key")); + break; case GUI_ID_KEY_SNEAK_BUTTON: resetMenu(); activeKey = event.GUIEvent.Caller->getID(); diff --git a/src/guiKeyChangeMenu.h b/src/guiKeyChangeMenu.h index a1dfa17c2..2e8773a77 100644 --- a/src/guiKeyChangeMenu.h +++ b/src/guiKeyChangeMenu.h @@ -43,6 +43,7 @@ enum GUI_ID_KEY_FAST_BUTTON, GUI_ID_KEY_JUMP_BUTTON, GUI_ID_KEY_CHAT_BUTTON, + GUI_ID_KEY_CMD_BUTTON, GUI_ID_KEY_SNEAK_BUTTON, GUI_ID_KEY_INVENTORY_BUTTON, GUI_ID_KEY_DUMP_BUTTON, @@ -87,6 +88,7 @@ private: gui::IGUIButton *range; gui::IGUIButton *dump; gui::IGUIButton *chat; + gui::IGUIButton *cmd; s32 activeKey; KeyPress key_forward; @@ -101,6 +103,7 @@ private: KeyPress key_fast; KeyPress key_range; KeyPress key_chat; + KeyPress key_cmd; KeyPress key_dump; }; diff --git a/src/guiTextInputMenu.cpp b/src/guiTextInputMenu.cpp index bfe0ea5de..208ced803 100644 --- a/src/guiTextInputMenu.cpp +++ b/src/guiTextInputMenu.cpp @@ -103,6 +103,12 @@ void GUITextInputMenu::regenerateGui(v2u32 screensize) gui::IGUIElement *e = Environment->addEditBox(text.c_str(), rect, true, this, 256); Environment->setFocus(e); + + irr::SEvent evt; + evt.EventType = EET_KEY_INPUT_EVENT; + evt.KeyInput.Key = KEY_END; + evt.KeyInput.PressedDown = true; + e->OnEvent(evt); } changeCtype(""); { diff --git a/src/server.cpp b/src/server.cpp index 5b657bc2e..f66592047 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -3245,13 +3245,13 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) u64 privs = getPlayerPrivs(player); // Parse commands - std::wstring commandprefix = L"/#"; - if(message.substr(0, commandprefix.size()) == commandprefix) + if(message[0] == L'/') { - line += L"Server: "; + size_t strip_size = 1; + if (message[1] == L'#') // support old-style commans + ++strip_size; + message = message.substr(strip_size); - message = message.substr(commandprefix.size()); - WStrfnd f1(message); f1.next(L" "); // Skip over /#whatever std::wstring paramstring = f1.next(L""); @@ -3264,9 +3264,15 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) player, privs); - line += processServerCommand(ctx); - send_to_sender = ctx->flags & 1; - send_to_others = ctx->flags & 2; + std::wstring reply(processServerCommand(ctx)); + send_to_sender = ctx->flags & SEND_TO_SENDER; + send_to_others = ctx->flags & SEND_TO_OTHERS; + + if (ctx->flags & SEND_NO_PREFIX) + line += reply; + else + line += L"Server: " + reply; + delete ctx; } diff --git a/src/servercommand.cpp b/src/servercommand.cpp index 663693b9a..89ba0771f 100644 --- a/src/servercommand.cpp +++ b/src/servercommand.cpp @@ -25,6 +25,14 @@ void cmd_status(std::wostringstream &os, os<server->getStatusString(); } +void cmd_me(std::wostringstream &os, + ServerCommandContext *ctx) +{ + std::wstring name = narrow_to_wide(ctx->player->getName()); + os << L"* " << name << L" " << ctx->paramstring; + ctx->flags |= SEND_TO_OTHERS | SEND_NO_PREFIX; +} + void cmd_privs(std::wostringstream &os, ServerCommandContext *ctx) { @@ -130,7 +138,7 @@ void cmd_shutdown(std::wostringstream &os, ctx->server->requestShutdown(); os<flags |= 2; + ctx->flags |= SEND_TO_OTHERS; } void cmd_setting(std::wostringstream &os, @@ -232,7 +240,7 @@ std::wstring processServerCommand(ServerCommandContext *ctx) { std::wostringstream os(std::ios_base::binary); - ctx->flags = 1; // Default, unless we change it. + ctx->flags = SEND_TO_SENDER; // Default, unless we change it. u64 privs = ctx->privs; @@ -283,6 +291,10 @@ std::wstring processServerCommand(ServerCommandContext *ctx) { cmd_banunban(os, ctx); } + else if(ctx->parms[0] == L"me") + { + cmd_me(os, ctx); + } else { os<parms[0]; diff --git a/src/servercommand.h b/src/servercommand.h index cee4976b1..648a57332 100644 --- a/src/servercommand.h +++ b/src/servercommand.h @@ -25,9 +25,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "player.h" #include "server.h" +#define SEND_TO_SENDER (1<<0) +#define SEND_TO_OTHERS (1<<1) +#define SEND_NO_PREFIX (1<<2) + struct ServerCommandContext { - std::vector parms; std::wstring paramstring; Server* server;