diff --git a/zone/bot_command.cpp b/zone/bot_command.cpp index 8030d4898..dc9d40aab 100644 --- a/zone/bot_command.cpp +++ b/zone/bot_command.cpp @@ -3414,6 +3414,12 @@ void bot_command_help(Client *c, const Seperator *sep) c->Message(m_usage, "%c%s - %s", BOT_COMMAND_CHAR, command_iter.first.c_str(), command_iter.second->desc == nullptr ? "[no description]" : command_iter.second->desc); ++bot_commands_shown; } + if (parse->PlayerHasQuestSub(EVENT_BOT_COMMAND)) { + int i = parse->EventPlayer(EVENT_BOT_COMMAND, c, sep->msg, 0); + if (i >= 1) { + bot_commands_shown += i; + } + } c->Message(m_message, "%d bot command%s listed.", bot_commands_shown, bot_commands_shown != 1 ? "s" : ""); c->Message(m_note, "type %ccommand [help | usage] for more information", BOT_COMMAND_CHAR); } diff --git a/zone/client.cpp b/zone/client.cpp index f77dc1fd4..d258ae7bf 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -1119,14 +1119,11 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s break; } - if (EQEmu::ProfanityManager::IsCensorshipActive()) - EQEmu::ProfanityManager::RedactMessage(message); - #ifdef BOTS if (message[0] == BOT_COMMAND_CHAR) { if (bot_command_dispatch(this, message) == -2) { - if (parse->PlayerHasQuestSub(EVENT_COMMAND)) { - int i = parse->EventPlayer(EVENT_COMMAND, this, message, 0); + if (parse->PlayerHasQuestSub(EVENT_BOT_COMMAND)) { + int i = parse->EventPlayer(EVENT_BOT_COMMAND, this, message, 0); if (i == 0 && !RuleB(Chat, SuppressCommandErrors)) { Message(Chat::Red, "Bot command '%s' not recognized.", message); } @@ -1140,6 +1137,10 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s } #endif + if (EQEmu::ProfanityManager::IsCensorshipActive()) { + EQEmu::ProfanityManager::RedactMessage(message); + } + Mob* sender = this; if (GetPet() && GetTarget() == GetPet() && GetPet()->FindType(SE_VoiceGraft)) sender = GetPet(); diff --git a/zone/command.cpp b/zone/command.cpp index cf8e47d6a..1f5da287c 100755 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -783,6 +783,12 @@ void command_help(Client *c, const Seperator *sep) commands_shown++; c->Message(Chat::White, " %c%s %s", COMMAND_CHAR, cur->first.c_str(), cur->second->desc == nullptr?"":cur->second->desc); } + if (parse->PlayerHasQuestSub(EVENT_COMMAND)) { + int i = parse->EventPlayer(EVENT_COMMAND, c, sep->msg, 0); + if (i >= 1) { + commands_shown += i; + } + } c->Message(Chat::White, "%d command%s listed.", commands_shown, commands_shown!=1?"s":""); } diff --git a/zone/embparser.cpp b/zone/embparser.cpp index 920d3a249..0f6fffd69 100644 --- a/zone/embparser.cpp +++ b/zone/embparser.cpp @@ -98,7 +98,7 @@ const char *QuestEventSubroutines[_LargestEventID] = { "EVENT_DUEL_LOSE", "EVENT_ENCOUNTER_LOAD", "EVENT_ENCOUNTER_UNLOAD", - "EVENT_SAY", + "EVENT_COMMAND", "EVENT_DROP_ITEM", "EVENT_DESTROY_ITEM", "EVENT_FEIGN_DEATH", @@ -119,6 +119,7 @@ const char *QuestEventSubroutines[_LargestEventID] = { "EVENT_DEATH_ZONE", "EVENT_USE_SKILL", "EVENT_COMBINE_VALIDATE", + "EVENT_BOT_COMMAND" }; PerlembParser::PerlembParser() : perl(nullptr) @@ -1542,9 +1543,9 @@ void PerlembParser::ExportEventVariables( } case EVENT_COMMAND: { - ExportVar(package_name.c_str(), "text", data); - ExportVar(package_name.c_str(), "data", "0"); - ExportVar(package_name.c_str(), "langid", "0"); + Seperator sep(data); + ExportVar(package_name.c_str(), "command", (sep.arg[0] + 1)); + ExportVar(package_name.c_str(), "args", (sep.argnum > 1 ? (&data[strlen(sep.arg[0]) + 1]) : "0")); break; } @@ -1610,6 +1611,12 @@ void PerlembParser::ExportEventVariables( ExportVar(package_name.c_str(), "tradeskill_id", tradeskill_id.c_str()); break; } + case EVENT_BOT_COMMAND: { + Seperator sep(data); + ExportVar(package_name.c_str(), "bot_command", (sep.arg[0] + 1)); + ExportVar(package_name.c_str(), "args", (sep.argnum > 1 ? (&data[strlen(sep.arg[0]) + 1]) : "0")); + break; + } default: { break; diff --git a/zone/event_codes.h b/zone/event_codes.h index 4560cc767..110101cf9 100644 --- a/zone/event_codes.h +++ b/zone/event_codes.h @@ -87,6 +87,7 @@ typedef enum { EVENT_DEATH_ZONE, EVENT_USE_SKILL, EVENT_COMBINE_VALIDATE, + EVENT_BOT_COMMAND, _LargestEventID } QuestEventID; diff --git a/zone/lua_parser.cpp b/zone/lua_parser.cpp index 437bc5121..620ee14d1 100644 --- a/zone/lua_parser.cpp +++ b/zone/lua_parser.cpp @@ -124,7 +124,8 @@ const char *LuaEvents[_LargestEventID] = { "event_spawn_zone", "event_death_zone", "event_use_skill", - "event_combine_validate" + "event_combine_validate", + "event_bot_command" }; extern Zone *zone; @@ -208,6 +209,7 @@ LuaParser::LuaParser() { PlayerArgumentDispatch[EVENT_UNHANDLED_OPCODE] = handle_player_packet; PlayerArgumentDispatch[EVENT_USE_SKILL] = handle_player_use_skill; PlayerArgumentDispatch[EVENT_COMBINE_VALIDATE] = handle_player_combine_validate; + PlayerArgumentDispatch[EVENT_BOT_COMMAND] = handle_player_bot_command; ItemArgumentDispatch[EVENT_ITEM_CLICK] = handle_item_click; ItemArgumentDispatch[EVENT_ITEM_CLICK_CAST] = handle_item_click; diff --git a/zone/lua_parser_events.cpp b/zone/lua_parser_events.cpp index f4f1dd3af..3ca9edad7 100644 --- a/zone/lua_parser_events.cpp +++ b/zone/lua_parser_events.cpp @@ -539,6 +539,25 @@ void handle_player_combine_validate(QuestInterface* parse, lua_State* L, Client* lua_setfield(L, -2, "tradeskill_id"); } +void handle_player_bot_command(QuestInterface* parse, lua_State* L, Client* client, std::string data, uint32 extra_data, + std::vector* extra_pointers) { + Seperator sep(data.c_str(), ' ', 10, 100, true); + std::string bot_command(sep.arg[0] + 1); + lua_pushstring(L, bot_command.c_str()); + lua_setfield(L, -2, "bot_command"); + + luabind::adl::object args = luabind::newtable(L); + int max_args = sep.GetMaxArgNum(); + for (int i = 1; i < max_args; ++i) { + if (strlen(sep.arg[i]) > 0) { + args[i] = std::string(sep.arg[i]); + } + } + + args.push(L); + lua_setfield(L, -2, "args"); +} + //Item void handle_item_click(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data, std::vector *extra_pointers) { diff --git a/zone/lua_parser_events.h b/zone/lua_parser_events.h index 0054b31e1..9eeeb11cb 100644 --- a/zone/lua_parser_events.h +++ b/zone/lua_parser_events.h @@ -99,6 +99,8 @@ void handle_player_use_skill(QuestInterface *parse, lua_State* L, Client* client std::vector *extra_pointers); void handle_player_combine_validate(QuestInterface* parse, lua_State* L, Client* client, std::string data, uint32 extra_data, std::vector* extra_pointers); +void handle_player_bot_command(QuestInterface *parse, lua_State* L, Client* client, std::string data, uint32 extra_data, + std::vector *extra_pointers); //Item void handle_item_click(QuestInterface *parse, lua_State* L, Client* client, EQEmu::ItemInstance* item, Mob *mob, std::string data, uint32 extra_data,