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

模拟服务器

开发平台:

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 "ObjectMgr.h"
  17. #include "UpdateMask.h"
  18. #include "WorldServer.h"
  19. #include "Character.h"
  20. #include "Item.h"
  21. //=====================================================================================================================
  22. //  Build and Send Create Player -- Builds and sends all the messages required to Create a player and his items
  23. //
  24. //  pNewChar - Object to use for creation
  25. //  createflag - 1 for current client's player, 0 for another player
  26. //  pReceiver - the character to receive this create message.  If null, send to pNewChar
  27. //=====================================================================================================================
  28. void ObjectMgr::BuildAndSendCreatePlayer(Character *pNewChar, uint32 createflag, Character *pReceiver)
  29. {
  30.     if (!pReceiver) pReceiver = pNewChar;
  31.     std::list<wowWData*> msglist;
  32.     BuildCreatePlayerMsg(pNewChar, &msglist, createflag);
  33.     std::list<wowWData*>::iterator msgitr;
  34.     for (msgitr = msglist.begin(); msgitr != msglist.end(); )
  35.     {
  36.         wowWData *msg = (*msgitr);
  37.         pReceiver->pClient->SendMsg(msg);
  38.         delete msg;
  39.         msgitr = msglist.erase(msgitr);
  40.     }
  41. }
  42. //===================================================================================================================
  43. //  Build Create Player Msg -- Builds a list of messages required to create a player and his items
  44. //  msglist - The std::list of wowWData message
  45. //===================================================================================================================
  46. void ObjectMgr::BuildCreatePlayerMsg(Character *pNewChar, std::list<wowWData*>* msglist, uint32 createflag)
  47. {
  48.     uint16 i=0, invcount=0, maxslots=46, invslots=23;
  49.     UpdateMask playerMask, invUpdateMask;
  50.     SetCreatePlayerBits(&playerMask);
  51.     if (createflag == 1)
  52.     {  
  53.         invslots = 39;
  54.         maxslots = 78;
  55.     pNewChar->setQuestLogBits(&playerMask);
  56.     }
  57. for(i = 0; i<maxslots; i+=2)
  58. {
  59. if (pNewChar->getGuidBySlot(i/2) != 0) {
  60. pNewChar->setUpdateValue( PLAYER_FIELD_INV_SLOT_HEAD + i , pNewChar->getGuidBySlot(i/2),  playerMask.updateMask);
  61. pNewChar->setUpdateValue( PLAYER_FIELD_INV_SLOT_HEAD + i + 1 , 0x00000040,  playerMask.updateMask);
  62. }
  63. }
  64.     // Create Item for this player
  65.     for(invcount = 0; invcount < invslots; invcount++)
  66. {
  67. if ((pNewChar->getGuidBySlot(invcount) != 0) && (pNewChar->getGuidBySlot(invcount) != 0)){
  68. invUpdateMask.clear();
  69. invUpdateMask.setCount(0x02);
  70. Item* tempitem = new Item;
  71.             wowWData *itemdata = new wowWData;
  72. invUpdateMask.setBit( OBJECT_FIELD_GUID );
  73. invUpdateMask.setBit( OBJECT_FIELD_GUID+1 );
  74. invUpdateMask.setBit( OBJECT_FIELD_TYPE );
  75. invUpdateMask.setBit( OBJECT_FIELD_ENTRY );
  76. invUpdateMask.setBit( OBJECT_FIELD_SCALE_X );
  77. invUpdateMask.setBit( OBJECT_FIELD_PADDING );
  78. invUpdateMask.setBit( ITEM_FIELD_OWNER );
  79. invUpdateMask.setBit( ITEM_FIELD_CONTAINED );
  80. invUpdateMask.setBit( ITEM_FIELD_OWNER +1 );
  81. invUpdateMask.setBit( ITEM_FIELD_CONTAINED +1 );
  82. invUpdateMask.setBit( ITEM_FIELD_STACK_COUNT );
  83. tempitem->Create(pNewChar->getGuidBySlot(invcount),pNewChar->getItemIdBySlot(invcount));
  84. tempitem->setUpdateValue( OBJECT_FIELD_GUID , pNewChar->getGuidBySlot(invcount) ,invUpdateMask.updateMask);
  85. tempitem->setUpdateValue( OBJECT_FIELD_GUID+1 , 0x00000040 ,invUpdateMask.updateMask);
  86. tempitem->setUpdateValue( OBJECT_FIELD_TYPE , 0x00000003 ,invUpdateMask.updateMask);
  87. tempitem->setUpdateValue( OBJECT_FIELD_ENTRY , pNewChar->getItemIdBySlot(invcount) ,invUpdateMask.updateMask);
  88. tempitem->setUpdateFloatValue( OBJECT_FIELD_SCALE_X , 1.0f ,invUpdateMask.updateMask);
  89. tempitem->setUpdateValue( OBJECT_FIELD_PADDING , 0xeeeeeeee ,invUpdateMask.updateMask);
  90. tempitem->setUpdateValue( ITEM_FIELD_OWNER , pNewChar->getGUID() ,invUpdateMask.updateMask);
  91. tempitem->setUpdateValue( ITEM_FIELD_CONTAINED , pNewChar->getGUID() ,invUpdateMask.updateMask);
  92. tempitem->setUpdateValue( ITEM_FIELD_OWNER +1 , 0 ,invUpdateMask.updateMask);
  93. tempitem->setUpdateValue( ITEM_FIELD_CONTAINED +1 , 0 ,invUpdateMask.updateMask);
  94. tempitem->setUpdateValue( ITEM_FIELD_STACK_COUNT , 1 ,invUpdateMask.updateMask);
  95. tempitem->CreateObject(&invUpdateMask, itemdata, 0);
  96.             msglist->push_front(itemdata);
  97. delete tempitem;
  98. }
  99. }
  100.     wowWData *data = new wowWData;
  101.     pNewChar->CreateObject(&playerMask, data, createflag);
  102.     msglist->push_front(data);
  103. }
  104. //===================================================================================================================
  105. //  Set Create Player Bits -- Sets bits required for creating a player in the updateMask.
  106. //  Note:  Doesn't set Quest or Inventory bits
  107. //  updateMask - the updatemask to hold the set bits
  108. //===================================================================================================================
  109. void ObjectMgr::SetCreatePlayerBits(UpdateMask *updateMask)
  110. {
  111.     // Set update mask for player creation
  112.     updateMask->setCount(PLAYER_BLOCKS);
  113.     updateMask->setBit(OBJECT_FIELD_GUID);          
  114.     updateMask->setBit(OBJECT_FIELD_TYPE);
  115.     updateMask->setBit(OBJECT_FIELD_SCALE_X);         
  116.     updateMask->setBit(OBJECT_FIELD_PADDING);
  117.     updateMask->setBit(UNIT_FIELD_HEALTH ); 
  118.     updateMask->setBit(UNIT_FIELD_POWER1  );        
  119.     updateMask->setBit(UNIT_FIELD_POWER2  );
  120.     updateMask->setBit(UNIT_FIELD_POWER3  );        
  121.     updateMask->setBit(UNIT_FIELD_POWER4 );
  122.     updateMask->setBit(UNIT_FIELD_MAXHEALTH  );
  123.     updateMask->setBit(UNIT_FIELD_MAXPOWER1  );        
  124.     updateMask->setBit(UNIT_FIELD_MAXPOWER2  );
  125.     updateMask->setBit(UNIT_FIELD_MAXPOWER3  );        
  126.     updateMask->setBit(UNIT_FIELD_MAXPOWER4 );
  127.     updateMask->setBit(UNIT_FIELD_LEVEL  );            
  128.     updateMask->setBit(UNIT_FIELD_FACTIONTEMPLATE  );
  129.     updateMask->setBit(UNIT_FIELD_BYTES_0 );          
  130.     updateMask->setBit(UNIT_FIELD_FLAGS  );
  131.     updateMask->setBit(UNIT_FIELD_BASEATTACKTIME );   
  132.     updateMask->setBit(UNIT_FIELD_BASEATTACKTIME+1  );
  133.     updateMask->setBit(UNIT_FIELD_BOUNDINGRADIUS );  
  134.     updateMask->setBit(UNIT_FIELD_COMBATREACH   );
  135.     updateMask->setBit(UNIT_FIELD_DISPLAYID  );       
  136.     updateMask->setBit(UNIT_FIELD_NATIVEDISPLAYID  );       
  137.     updateMask->setBit(UNIT_FIELD_MINDAMAGE);
  138.     updateMask->setBit(UNIT_FIELD_MAXDAMAGE );
  139.     updateMask->setBit(UNIT_FIELD_BYTES_1 );  
  140.     updateMask->setBit(UNIT_FIELD_MOUNTDISPLAYID);
  141.     updateMask->setBit(UNIT_FIELD_STAT0  );
  142.     updateMask->setBit(UNIT_FIELD_STAT1 );            
  143.     updateMask->setBit(UNIT_FIELD_STAT2 );
  144.     updateMask->setBit(UNIT_FIELD_STAT3  );            
  145.     updateMask->setBit(UNIT_FIELD_STAT4  );
  146.     updateMask->setBit(PLAYER_BYTES);
  147.     updateMask->setBit(PLAYER_BYTES_2 );
  148.     updateMask->setBit(PLAYER_BYTES_3 );
  149.     updateMask->setBit(PLAYER_XP );                 
  150.     updateMask->setBit(PLAYER_NEXT_LEVEL_XP);
  151.     updateMask->setBit(PLAYER_REST_STATE_EXPERIENCE );         
  152.     updateMask->setBit(PLAYER_FIELD_COINAGE  );
  153.     updateMask->setBit(PLAYER_FIELD_POSSTAT0  );        
  154.     updateMask->setBit(PLAYER_FIELD_POSSTAT1 );
  155.     updateMask->setBit(PLAYER_FIELD_POSSTAT2 );        
  156.     updateMask->setBit(PLAYER_FIELD_POSSTAT3 );
  157.     updateMask->setBit(PLAYER_FIELD_POSSTAT4 );        
  158.     updateMask->setBit(PLAYER_FIELD_NEGSTAT0 );        
  159.     updateMask->setBit(PLAYER_FIELD_NEGSTAT1 );
  160.     updateMask->setBit(PLAYER_FIELD_NEGSTAT2 );        
  161.     updateMask->setBit(PLAYER_FIELD_NEGSTAT3 );
  162.     updateMask->setBit(PLAYER_FIELD_NEGSTAT4 );            
  163.     updateMask->setBit(UNIT_FIELD_ATTACKPOWER );
  164. //    updateMask->setBit(PLAYER_FIELD_ATTACKPOWERMODPOS );
  165. //    updateMask->setBit(PLAYER_FIELD_ATTACKPOWERMODNEG );
  166. }
  167. void ObjectMgr::SetCreateUnitBits(UpdateMask &npcMask)
  168. {
  169.     npcMask.setCount(UNIT_BLOCKS);
  170.     npcMask.setBit(OBJECT_FIELD_GUID);   
  171.     npcMask.setBit(OBJECT_FIELD_GUID+1);
  172.     npcMask.setBit(OBJECT_FIELD_TYPE);   
  173.     npcMask.setBit(OBJECT_FIELD_ENTRY);
  174.     npcMask.setBit(OBJECT_FIELD_SCALE_X);
  175.     npcMask.setBit(UNIT_FIELD_HEALTH);
  176.     npcMask.setBit(UNIT_FIELD_MAXHEALTH );
  177.     npcMask.setBit(UNIT_FIELD_LEVEL );
  178.     npcMask.setBit(UNIT_FIELD_FACTIONTEMPLATE );
  179.     npcMask.setBit(UNIT_FIELD_FLAGS  );
  180.     npcMask.setBit(UNIT_FIELD_DISPLAYID );
  181.     npcMask.setBit(UNIT_FIELD_MOUNTDISPLAYID );
  182.     npcMask.setBit(UNIT_NPC_FLAGS );
  183.     npcMask.setBit(UNIT_FIELD_COMBATREACH );
  184.     npcMask.setBit(UNIT_FIELD_MAXDAMAGE  );
  185.     npcMask.setBit(UNIT_FIELD_MINDAMAGE );
  186.     npcMask.setBit(UNIT_FIELD_BASEATTACKTIME);
  187.     npcMask.setBit(UNIT_FIELD_BASEATTACKTIME+1);
  188.     npcMask.setBit(UNIT_FIELD_BOUNDINGRADIUS);
  189. }
  190. void ObjectMgr::BuildCreateUnitMsg(Unit *pNewUnit, wowWData *data, Character *pPlayer)
  191. {
  192.     UpdateMask unitMask;
  193.     if (!pNewUnit->isDead())
  194.     {
  195.         SetCreateUnitBits(unitMask);
  196.         if (pNewUnit->CheckQuestgiverFlag(pPlayer, &unitMask, data) == 1)  return;
  197.         pNewUnit->CreateObject(&unitMask, data, 0);
  198.     }
  199. }