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

模拟服务器

开发平台:

Visual C++

  1. #include "SpellHandler.h" #include "NetworkInterface.h" #include "Opcodes.h" #include "Log.h" #include "Character.h" #include "WorldServer.h" #include "Database.h" #include "UpdateMask.h" #include "Unit.h" #include "Spell.h" #include "Character.h" #include "math.h" #include "PetHandler.h" #define world WorldServer::getSingleton() PetHandler::PetHandler() { } PetHandler::~PetHandler() { } void PetHandler::HandleMsg( wowWData & recv_data, GameClient *pClient ) { wowWData data; wowWData data2;     char f[256];     sprintf(f, "WORLD: Pet 0x%.4X", recv_data.opcode);     Log::getSingleton( ).outString( f ); switch (recv_data.opcode) { case CMSG_PET_ACTION: { uint64 pguid, petGUID, unitTarget; //LINA uint32 spell; uint16 flags, flags2; recv_data >> petGUID >> flags >> flags2; pguid = pClient->getCurrentChar()->getGUID(); /* SpellInformation spellInfo; DatabaseInterface *dbi = Database::getSingleton().createDatabaseInterface(); //get a hook for the DB spellInfo = dbi->GetSpellInformation ( spell ); //returns a SpellInformation object/struct Database::getSingleton().removeDatabaseInterface( dbi ); //clean up used resources */ printf("flags: %un", flags); printf("flags2: %un", flags2);
  2. printf("petGUID %un", petGUID);
  3. Unit* pet_caster = world.GetCreature(petGUID);
  4. if(pet_caster)
  5. { if(flags == 0x0002 && flags2 == 1792)
  6. { // ATTACK pet_caster->m_follow = false; recv_data >> unitTarget; //printf("unitTarget %un", unitTarget); data.clear(); data.Initialise(12, SMSG_AI_REACTION); data << petGUID << uint32(00000002); pClient->SendMsg(&data); pet_caster->AI_AttackReaction(world.GetCreature(unitTarget), 0); }
  7. else if(flags == 0x0001 && flags2 == 1792)
  8. { // FOLLOW pet_caster->m_follow = true; }
  9. else if(flags == 0x0000 && flags2 == 1792)
  10. { // STAY pet_caster->m_follow = false; }
  11. else if(flags2 == 256 || flags2 == 16640)
  12. {
  13. SpellInformation spellInfo;
  14. DatabaseInterface *dbi = Database::getSingleton().createDatabaseInterface(); //get a hook for the DB
  15. spellInfo = dbi->GetSpellInformation ( flags ); //returns a SpellInformation object/struct
  16. Database::getSingleton().removeDatabaseInterface( dbi ); //clean up used resources
  17. recv_data >> unitTarget;
  18. printf("recv_data >> flags: %un", flags);
  19. Unit* unit_target = world.GetCreature(unitTarget);
  20. if(unit_target)
  21. {
  22. if(spellInfo.race == 0 || unit_target->getRace() == spellInfo.race)
  23. {
  24. //if(  > spellInfo.Range ){
  25. data.clear();
  26. data.Initialise(36,SMSG_SPELL_START);
  27. data << petGUID << petGUID << uint32(0x00000C26) << uint16(0x0002);
  28. data << uint32(0x000007D0) << uint16(0x0002) << unitTarget;
  29. pet_caster->SendMessageToSet(&data,true);
  30. data.clear();
  31. data.Initialise(42,SMSG_SPELL_GO);
  32. data << petGUID << petGUID << uint32(0x00000C26) << uint16(0x0100);
  33. data << uint8(0x01) << unitTarget << uint8(0x00) << uint16(0x0002);
  34. data << unitTarget;
  35. pet_caster->SendMessageToSet(&data,true);
  36. uint32 damage = spellInfo.DmgPlus1+rand()%spellInfo.RandomPercentDmg;
  37. world.mCombatHandler.AttackerStateUpdate(pet_caster, world.getCreatureMap( )[ unitTarget ], damage);
  38. if(spellInfo.addDuration > 0)
  39. {
  40. Unit* cast_target = world.GetCreature(unitTarget);
  41. if( cast_target )
  42. {
  43. uint32 time = spellInfo.addDuration/1000;
  44. uint32 addDmg = (uint32)((float)spellInfo.addDmg/(float)time);
  45. if(addDmg == 0)
  46. addDmg = 1;
  47. cast_target->m_damageDuration = spellInfo.addDuration/1000;
  48. cast_target->m_damage = addDmg;
  49. cast_target->m_Attacker = petGUID;
  50. }
  51. }
  52. uint32 mana = pet_caster->getUpdateValue( UNIT_FIELD_POWER1 );
  53. pet_caster->setUpdateValue( UNIT_FIELD_POWER1, mana-spellInfo.ManaCost );
  54.          data.clear();
  55.          data.Initialise( 5, SMSG_CAST_RESULT );
  56.          data << flags << uint8( 0x01);
  57.          pet_caster->SendMessageToSet(&data,true);
  58. }
  59. else
  60. {
  61. data.clear();
  62.          data.Initialise( 6, SMSG_CAST_RESULT );
  63.          data << flags << uint8( 0x02);
  64. data << uint8(9);
  65.          pet_caster->SendMessageToSet(&data,true);
  66. }
  67. } }
  68. else if(flags == 0 && flags2 == 1536)
  69. {//passive pet_caster->m_pet_state = 0; }
  70. else if(flags == 1 && flags2 == 1536)
  71. {//defensive pet_caster->m_pet_state = 1; //pet_caster->m_creatureState = MOVING; //pet_caster->setUpdateValue(UNIT_FIELD_TARGET,205); }
  72. else if(flags == 2 && flags2 == 1536)
  73. {//aggressive pet_caster->m_pet_state = 2; }
  74. else if(flags == 0x0003 && flags2 == 1792)
  75. {
  76. std::map<uint32, Unit*>::iterator itr = world.mCreatures.find(petGUID); 
  77. for( WorldServer::CharacterMap::iterator iter = world.mCharacters.begin( ); iter != world.mCharacters.end( ); ++ iter ) 
  78. iter->second->RemoveInRangeObject( itr->second ); 
  79.     
  80. itr->second->setDeathState(DEAD);
  81. delete itr->second; 
  82.     world.mCreatures.erase(itr); 
  83. data.clear(); 
  84. data.Initialise(8, SMSG_DESTROY_OBJECT); 
  85. data << (uint32)petGUID << (uint32)pet_caster->getGUIDHigh(); 
  86. pClient->getCurrentChar()->SendMessageToSet(&data, true); 
  87.     
  88. DatabaseInterface *dbi = Database::getSingleton( ).createDatabaseInterface( ); 
  89. char sql[512]; 
  90. sprintf(sql, "DELETE FROM creatures WHERE id=%u", petGUID); 
  91. dbi->doQuery(sql); 
  92. Database::getSingleton( ).removeDatabaseInterface(dbi); 
  93. pClient->getCurrentChar()->setUpdateValue(ITEM_FIELD_CONTAINED,0);
  94. pClient->getCurrentChar()->setUpdateValue(UNIT_FIELD_SUMMON,   0);
  95. pClient->getCurrentChar()->setUpdateValue(GAMEOBJECT_ROTATION, 0);
  96. pClient->getCurrentChar()->setUpdateValue(DYNAMICOBJECT_BYTES, 0);
  97. pClient->getCurrentChar()->setUpdateValue(CORPSE_FIELD_FACING, 0);
  98. pClient->getCurrentChar()->setUpdateValue(UNIT_FIELD_SUMMON+1, 0xf0001000);
  99. pClient->getCurrentChar()->setUpdateValue(GAMEOBJECT_ROTATION+1, 0xf0001000);
  100. pClient->getCurrentChar()->setUpdateValue(DYNAMICOBJECT_SPELLID, 0xf0001000);
  101. data.clear();
  102. data.Initialise(62, SMSG_PET_SPELLS);
  103. data << (uint64)0;
  104. pClient->SendMsg(&data);
  105. }
  106. else
  107. { printf("WRONG FLAGSn"); }
  108. } } } }