T端国外WOW私服中的一个带自动回复的假人C++系统
这个是一套带自动回复和瞧瞧话的假人系统,适用于TRINITY端的335版本吧??大家可以试试 下面是部分代码。完整代码请下载下面的连接 Index: src/arcemu-world/Chat.h =================================================================== --- src/arcemu-world/Chat.h (revision 3174) +++ src/arcemu-world/Chat.h (working copy) @@ -255,6 +255,7 @@ bool HandleAnnounceCommand(const char* args, WorldSession *m_session); bool HandleGMAnnounceCommand(const char* args, WorldSession *m_session); bool HandleWAnnounceCommand(const char* args, WorldSession *m_session); + bool HandleFakew(const char* args, WorldSession *m_session); bool HandleGMOnCommand(const char* args, WorldSession *m_session); bool HandleGMOffCommand(const char* args, WorldSession *m_session); bool HandleGPSCommand(const char* args, WorldSession *m_session); Index: src/arcemu-world/ChatHandler.cpp =================================================================== --- src/arcemu-world/ChatHandler.cpp (revision 3174) +++ src/arcemu-world/ChatHandler.cpp (working copy) @@ -378,11 +378,32 @@ Player *player = objmgr.GetPlayer(to.c_str(), false); if(!player) { - data = new WorldPacket(SMSG_CHAT_PLAYER_NOT_FOUND, to.length() + 1); - *data << to; + //data = new WorldPacket(SMSG_CHAT_PLAYER_NOT_FOUND, to.length() + 1); + //*data << to; + + QueryResult *result = CharacterDatabase.Query( + "SELECT * FROM fake_players WHERE online=1 and name='%s'", to.c_str()); + if(!result) + { + data = new WorldPacket(SMSG_CHAT_PLAYER_NOT_FOUND, to.length() + 1); + *data << to; + SendPacket(data); + delete data; + return; + } + + if(sWorld.announce_output) + sLog.outString("[whisper] %s to *%s*: %s", _player->GetName(), to.c_str(), msg.c_str()); + + uint32 fakeuid = result->Fetch()[0].GetInt32() | 0x10000000; + //printf("sending fakeuid 0x%x ", fakeuid); + delete result; + + data = sChatHandler.FillMessageData(CHAT_MSG_WHISPER_INFORM, LANG_UNIVERSAL,msg.c_str(), fakeuid, 0 ); + SendPacket(data); delete data; - break; + return; } // Check that the player isn't a gm with his status on Index: src/arcemu-world/ConsoleCommands.cpp =================================================================== --- src/arcemu-world/ConsoleCommands.cpp (revision 3174) +++ src/arcemu-world/ConsoleCommands.cpp (working copy) @@ -149,6 +149,37 @@ pConsole->Write("Message sent. "); return true; } + +bool HandleFakew(BaseConsole * pConsole, int argc, const char * argv[]) +{ + if(argc < 4) return false; + + LPCSTR source = argv[1]; + LPCSTR target = argv[2]; + + CHAR msg[1024] = ""; + for(int i = 3; i < argc; i++) + sprintf(msg + strlen(msg), "%s ", argv[i]); + + QueryResult *result = CharacterDatabase.Query( + "SELECT * FROM fake_players WHERE online=1 and name='%s'", source); + if(!result) return false; + + uint32 fakeuid = result->Fetch()[0].GetInt32() | 0x10000000; + delete result; + + Player *player = objmgr.GetPlayer(target, false); + if(!player) return false; + + WorldPacket *data = sChatHandler.FillMessageData(CHAT_MSG_WHISPER, LANG_UNIVERSAL, msg, fakeuid, 0 ); + if(!data) return false; + + player->GetSession()->SendPacket(data); + delete data; + + return true; +} + bool HandleWhisperCommand(BaseConsole * pConsole, int argc, const char * argv[]) { char pAnnounce[1024]; Index: src/arcemu-world/ConsoleCommands.h =================================================================== --- src/arcemu-world/ConsoleCommands.h (revision 3174) +++ src/arcemu-world/ConsoleCommands.h (working copy) @@ -36,6 +36,7 @@ bool HandleShutDownCommand(BaseConsole * pConsole, int argc, const char * argv[]); bool HandleUnbanAccountCommand(BaseConsole * pConsole, int argc, const char * argv[]); bool HandleWAnnounceCommand(BaseConsole * pConsole, int argc, const char * argv[]); +bool HandleFakew(BaseConsole * pConsole, int argc, const char * argv[]); bool HandleWhisperCommand(BaseConsole * pConsole, int argc, const char * argv[]); bool HandleNameHashCommand(BaseConsole * pConsole, int argc, const char * argv[]); bool HandleRevivePlayer(BaseConsole * pConsole, int argc, const char * argv[]); Index: src/arcemu-world/ConsoleListener.cpp =================================================================== --- src/arcemu-world/ConsoleListener.cpp (revision 3174) +++ src/arcemu-world/ConsoleListener.cpp (working copy) @@ -459,6 +459,11 @@ "wannounce", "<wannounce string>", "Shows the message in all client title areas." }, + { + &HandleFakew, + "fakew", "<source> <player> <message>", + "Whispers a message to someone from the fake source." + }, { &HandleWhisperCommand, "whisper","<player> <message>", Index: src/arcemu-world/MiscHandler.cpp =================================================================== --- src/arcemu-world/MiscHandler.cpp (revision 3174) +++ src/arcemu-world/MiscHandler.cpp (working copy) @@ -792,6 +792,43 @@ ++sent_count; } objmgr._playerslock.ReleaseReadLock(); + + //////////////////////////////////////////////////////////////////////////////////// + + QueryResult *result = NULL; + + if(cname) + result = CharacterDatabase.Query("SELECT * FROM fake_players WHERE online=1 and name='%s'", chatname.c_str()); + + else if(zone_count) + result = CharacterDatabase.Query("SELECT * FROM fake_players WHERE online=1 and zoneid=%u order by name", zones[0]); + + else + result = CharacterDatabase.Query("SELECT * FROM fake_players WHERE online=1 order by name"); + + if(result) + { + do + { + if(sent_count < 49) + { + data << result->Fetch()[1].GetString(); + data << result->Fetch()[2].GetString(); + data << result->Fetch()[3].GetInt32(); + data << result->Fetch()[4].GetInt32(); + data << result->Fetch()[5].GetInt32(); + data << uint8(0); + data << result->Fetch()[6].GetInt32(); + + ++sent_count; + } + } + while (result->NextRow()); + delete result; + } + + //////////////////////////////////////////////////////////////////////////////////// + data.wpos(0); data << sent_count; data << sent_count; Index: src/arcemu-world/QueryHandler.cpp =================================================================== --- src/arcemu-world/QueryHandler.cpp (revision 3174) +++ src/arcemu-world/QueryHandler.cpp (working copy) @@ -29,25 +29,51 @@ uint64 guid; recv_data >> guid; - PlayerInfo *pn = objmgr.GetPlayerInfo( (uint32)guid ); + if(guid & 0x10000000) + { + int32 real_guid = int32(guid) & ~0x10000000; + //printf(" its a fake 0x%x, %d ", int32(guid), real_guid); + + QueryResult *result = CharacterDatabase.Query( + "SELECT * FROM fake_players WHERE online=1 and entry=%d", real_guid); + if(!result) return; + + const char *name = result->Fetch()[1].GetString(); + //printf(" found %s ", name); + + WorldPacket data(SMSG_NAME_QUERY_RESPONSE, strlen(name) + 35); + data << int32(guid) << uint32(0); //highguid + data << name; + data << uint8(0); // this is a string showed besides players name (eg. in combat log), a custom title ? + data << result->Fetch()[5].GetInt32() << int32(0) << result->Fetch()[4].GetInt32(); +// data << uint8(0); // 2.4.0, why do i get the feeling blizz is adding custom classes or custom titles? (same thing in who list) + SendPacket( &data ); - if(!pn) - return; + delete result; + } - sLog.outDebug( "Received CMSG_NAME_QUERY for: %s", pn->name ); + else + { + PlayerInfo *pn = objmgr.GetPlayerInfo( (uint32)guid ); - WoWGuid pguid((uint64)pn->guid); //VLack: The usual new style guid handling on 3.1.2 - WorldPacket data(SMSG_NAME_QUERY_RESPONSE, strlen(pn->name) + 35); -// data << pn->guid << uint32(0); //highguid - data << pguid << uint8(0); //VLack: usual, new-style guid with an uint8 - data << pn->name; - data << uint8(0); // this is a string showed besides players name (eg. in combat log), a custom title ? - data << uint8(pn->race) << uint8(pn->gender) << uint8(pn->cl); -// data << uint8(0); // 2.4.0, why do i get the feeling blizz is adding custom classes or custom titles? (same thing in who list) - data << uint8(0); //VLack: tell the server this name is not declined... (3.1 fix?) - SendPacket( &data ); + if(!pn) + return; + + sLog.outDebug( "Received CMSG_NAME_QUERY for: %s", pn->name ); + WoWGuid pguid((uint64)pn->guid); + WorldPacket data(SMSG_NAME_QUERY_RESPONSE, strlen(pn->name) + 35); + data << pguid << uint8(0); //VLack: usual, new-style guid with an uint8 + data << pn->name; + data << uint8(0); // this is a string showed besides players name (eg. in combat log), a custom title ? + data << uint8(pn->race) << uint8(pn->gender) << uint8(pn->cl); + // data << uint8(0); // 2.4.0, why do i get the feeling blizz is adding custom classes or custom titles? (same thing in who list) + data << uint8(0); //VLack: tell the server this name is not declined... (3.1 fix?) + SendPacket( &data ); + } + } + ////////////////////////////////////////////////////////////// /// This function handles CMSG_QUERY_TIME: //////////////////////////////////////////////////////////////