QueryHandler.cpp
上传用户:jxpjxmjjw
上传日期:2009-12-07
资源大小:5877k
文件大小:6k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. // Copyright (C) 2004 Team Python
  2. //  
  3. // This program is free software; you can redistribute it and/or modify
  4. // it under the terms of the GNU General Public License as published by
  5. // the Free Software Foundation; either version 2 of the License, or
  6. // (at your option) any later version.
  7. // 
  8. // This program is distributed in the hope that it will be useful,
  9. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. // GNU General Public License for more details.
  12. // 
  13. // You should have received a copy of the GNU General Public License
  14. // along with this program; if not, write to the Free Software 
  15. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  16. #include "QueryHandler.h"
  17. #include "NetworkInterface.h"
  18. #include "GameClient.h"
  19. #include "Opcodes.h"
  20. #include "Log.h"
  21. #include "WorldServer.h"
  22. #include "Character.h"
  23. #include "UpdateMask.h"
  24. #include "Database.h"
  25. #include <time.h>
  26. #define world WorldServer::getSingleton()
  27. QueryHandler::QueryHandler()
  28. {
  29. }
  30. QueryHandler::~QueryHandler()
  31. {
  32. }
  33. void QueryHandler::HandleMsg( wowWData & recv_data, GameClient *pClient )
  34. {
  35.     wowWData data;
  36.     char f[256];
  37.     sprintf(f, "WORLD: Query Opcode 0x%.4X", recv_data.opcode);
  38.     Log::getSingleton( ).outString( f );
  39.     switch (recv_data.opcode)
  40.     {
  41.         case CMSG_NAME_QUERY:
  42.         {
  43.             uint32 guid;
  44.             memcpy(&guid, recv_data.data, 4);
  45.             uint32 race = 0, gender = 0, cl = 0;
  46.             char name[32] = "ERROR_NO_NAME_FOR_GUID";
  47.             std::map<uint32, Character*>::iterator itr = world.mCharacters.find(guid);
  48.             if (itr == world.mCharacters.end()) {
  49.                 DatabaseInterface *dbi = Database::getSingleton( ).createDatabaseInterface( );
  50.                 if (!dbi->GetPlayerNameFromGUID(guid, (uint8*)name))
  51.                     Log::getSingleton( ).outString( "No player name found for this guid" );
  52.                 Database::getSingleton( ).removeDatabaseInterface( dbi );
  53.             } else {
  54.                 Character *pChar = world.mCharacters[guid];         
  55.                 race = pChar->getRace();
  56.                 gender = pChar->getGender();
  57.                 cl = pChar->getClass();
  58.                 strcpy(name, pChar->getName());
  59.             }
  60.             data.clear();
  61.             data.length = 8 + strlen(name)+ 1 + 3*sizeof(uint32);
  62.             data.data = new uint8[ data.length ];
  63.             data.opcode = SMSG_NAME_QUERY_RESPONSE;
  64.             Log::getSingleton( ).outString( name );
  65.             data << guid << uint32(0);
  66.             data << (std::string)name;
  67.             data << race << gender << cl;
  68.             pClient->SendMsg( &data );
  69.         } break;
  70.         case CMSG_QUERY_TIME:
  71.         {
  72.             data.clear();
  73.             data.Initialise(4, SMSG_QUERY_TIME_RESPONSE);
  74.             data << (int32)time(NULL);
  75.             pClient->SendMsg(&data);
  76.         }break;
  77.         case CMSG_CREATURE_QUERY:
  78.         {
  79.             uint32 entry=0;
  80.             uint32 guid=0;
  81.             recv_data.readData(entry);
  82.             recv_data.readData(guid);
  83.             uint8 *name = 0;
  84.             /*std::map<uint32, uint8*>::iterator itr = world.mCreatureNames.find(entry);
  85.             if (itr == world.mCreatureNames.end()){
  86.                 WPAssert(!"invalid creature entry");
  87.             }*/
  88.             name = world.mCreatureNames[entry];
  89.             if (!name)
  90. name = (uint8 *)"ERROR_NO_CREATURENAME_FOR_ENTRY";
  91.             //    return;
  92.             printf(" WORLD: CMSG_CREATURE_QUERY '%s'n", name );
  93.             
  94.             uint16 namesize = strlen((char*)name)+1;
  95.             data.clear();
  96.             data.Initialise(4+namesize+16, SMSG_CREATURE_QUERY_RESPONSE);
  97.             data << (uint32)entry;
  98.             strcpy((char*)data.data+4, (char*)name);
  99.             uint8 somedata[] = 
  100.             { 
  101.                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 
  102.                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  103.             };
  104.             memcpy(data.data+namesize+4, somedata, 16);
  105.             pClient->SendMsg(&data);
  106.         }break;
  107.         
  108.         case CMSG_GAMEOBJECT_QUERY:
  109. {
  110. data.Initialise( 64, SMSG_GAMEOBJECT_QUERY_RESPONSE );
  111.             //TODO: Check the database for the ENTRY (First long) and obtain all the details from there...
  112.             data << uint32( 0x00000787 ) << uint32( 0x00000013 ) << uint32( 0x0000088e );                    
  113.             data << uint32( 0x6c69614d ) << uint32( 0x00786f62 );
  114.             data << uint32( 0x00000000 ) << uint32( 0x00000000 ) << uint32( 0x00000000 );
  115.             data << uint32( 0x00000000 );
  116.             data << uint32( 0 ) << uint32( 0 ) << uint32( 0 ) << uint32( 0 ) << uint32( 0 ) << uint32( 0 );
  117.             data << uint16( 0 ) << uint8( 0 );
  118.             /*
  119.             00 00 07 87 00 00 00 08 00 00 00 C0 54 F9 EC 01 
  120.             04 00 00 00 0A 00 00 00 12 00 00 00 00 00 00 08 
  121.             00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  122.             00 00 00 00 00 00 00 00 00 00 00 4F 52 44 45 52 
  123.             */
  124.             /* Mailbox
  125.             22 33 02 00 // ENTRY
  126.             13 00 00 00 // Unknown
  127.             8e 08 00 00 // Display_id
  128.             4d 61 69 6c | 62 6f 78 00 // Mailbox (Null terminated)
  129.             00 00 00 00 // 1
  130.             00 00 00 00 // 2
  131.             00 00 00 00 // 3
  132.             00 00 00 00 // 4
  133.             00 00 00 00 // 5
  134.             00 00 00 00 // 6
  135.             00 00 00 00 // 7
  136.             00 00 00 00 // 8
  137.             00 00 00 00 // 9
  138.             00 00 00 00 // 10
  139.             00 00 00    // 11
  140.             */
  141.             pClient->SendMsg( &data );  
  142.             Log::getSingleton( ).outString( "WORLD: Sent Object Query Response." );
  143. }break;
  144.     }
  145. }