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

模拟服务器

开发平台:

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 "GroupHandler.h"
  17. #include "NetworkInterface.h"
  18. #include "Opcodes.h"
  19. #include "Log.h"
  20. #include "Character.h"
  21. #include "WorldServer.h"
  22. #include "Database.h"
  23. #include <string.h>
  24. GroupHandler::GroupHandler( ) {
  25. }
  26. GroupHandler::~GroupHandler( ) {
  27. }
  28. void GroupHandler::HandleMsg( wowWData & recv_data, GameClient *pClient )
  29. {
  30.     wowWData data;
  31. char f[256];
  32.     sprintf(f, "WORLD: Group Opcode 0x%.4X", recv_data.opcode);
  33.     Log::getSingleton( ).outString( f );
  34.     switch (recv_data.opcode)
  35.     {
  36. case CMSG_GROUP_INVITE:
  37. {
  38. Group *tempGroup;
  39. std::string membername;
  40. recv_data >> membername;
  41. GameClient * tempClient;
  42. Character * tempChar;
  43. tempClient = WorldServer::getSingleton().GetClientByName((char *)membername.c_str());
  44. if (tempClient == NULL) {
  45. data.clear();
  46. data.Initialise(sizeof(uint32) + 1 + strlen(membername.c_str()) + sizeof(uint32),SMSG_PARTY_COMMAND_RESULT);
  47. data << uint32( 0x0 );
  48. data.writeData((char *)membername.c_str() , strlen(membername.c_str()) + 1 );
  49. data << uint32( 0x00000001 );
  50. pClient->SendMsg( &data );
  51. break;
  52. }
  53. if ((pClient->getCurrentChar()->IsInGroup()) && (strcmp(pClient->getCurrentChar()->GetGroupLeader(),pClient->getCharacterName()) != 0)) {
  54. data.clear();
  55. data.Initialise(sizeof(uint32) + 1 + sizeof(uint32),SMSG_PARTY_COMMAND_RESULT);
  56. data << uint32( 0 ) << uint8( 0 );
  57. data << uint32( 0x00000006 );
  58. pClient->SendMsg( &data );
  59. break;
  60. }
  61. tempGroup = WorldServer::getSingleton().GetGroupByLeader(pClient->getCurrentChar()->GetGroupLeader());
  62. if (tempGroup != NULL) {
  63. if (tempGroup->IsFull()) {
  64. data.Initialise(sizeof(uint32) + 1 + sizeof(uint32),SMSG_PARTY_COMMAND_RESULT);
  65. data << uint32( 0 ) << uint8( 0 );
  66. data << uint32( 0x00000003 );
  67. pClient->SendMsg( &data );
  68. break;
  69. }
  70. }
  71. tempChar = tempClient->getCurrentChar();
  72. if (tempChar->IsInGroup()) {
  73. data.clear();
  74. data.Initialise(sizeof(uint32) + 1 + strlen(membername.c_str()) + sizeof(uint32),SMSG_PARTY_COMMAND_RESULT);
  75. data << uint32( 0x0 );
  76. data.writeData((char *)membername.c_str() , strlen(membername.c_str()) + 1 );
  77. data << uint32( 0x00000004 );
  78. pClient->SendMsg( &data );
  79. break;
  80. }
  81. if (tempChar->IsInvited()) {
  82. break;
  83. }
  84. data.Initialise(strlen(pClient->getCharacterName()) + 1, SMSG_GROUP_INVITE);
  85. data.writeData(pClient->getCharacterName(), strlen(pClient->getCharacterName()) +1);
  86. if (WorldServer::getSingleton().SendMessageToPlayer(&data, (char *)membername.c_str()) == 0) {
  87. data.clear();
  88. data.Initialise(sizeof(uint32) + 1 + strlen(membername.c_str()) + sizeof(uint32),SMSG_PARTY_COMMAND_RESULT);
  89. data << uint32( 0x0 );
  90. data.writeData((char *)membername.c_str() , strlen(membername.c_str()) + 1 );
  91. data << uint32( 0x00000001 );
  92. pClient->SendMsg( &data );
  93. }
  94. else {
  95. data.clear();
  96. data.Initialise(sizeof(uint32) + 1 + strlen(membername.c_str()) + sizeof(uint32),SMSG_PARTY_COMMAND_RESULT);
  97. data << uint32( 0x0 );
  98. data.writeData((char *)membername.c_str() , strlen(membername.c_str()) + 1 );
  99. data << uint32( 0x00000000 );
  100. pClient->SendMsg( &data );
  101. tempChar->SetLeader(pClient->getCharacterName());
  102. tempChar->SetInvited();
  103. }
  104. }break;
  105. /* case CMSG_GROUP_CANCEL:
  106. {
  107. }break;
  108. */
  109. case CMSG_GROUP_ACCEPT:
  110. {
  111. GameClient * tempClient;
  112. Character * tempChar;
  113. Character * CurrentChar;
  114. CurrentChar = pClient->getCurrentChar();
  115. tempClient = WorldServer::getSingleton().GetClientByName(CurrentChar->GetGroupLeader());
  116. if (!tempClient)
  117. break;
  118. tempChar = tempClient->getCurrentChar();
  119. if (!CurrentChar->IsInvited()) {
  120. break;
  121. }
  122. CurrentChar->UnSetInvited();
  123. if ( (tempChar->IsInGroup()) && ( STRCASECMP(tempChar->GetGroupLeader(),tempClient->getCharacterName()) == 0) ) {
  124. CurrentChar->SetInGroup();
  125. Group *tempGroup;
  126. tempGroup = WorldServer::getSingleton().GetGroupByLeader(CurrentChar->GetGroupLeader());
  127. if (tempGroup != NULL) {
  128. tempGroup->AddMember(pClient->getCharacterName(), CurrentChar->getGUID(),0);
  129. tempGroup->SendUpdate();
  130. }
  131. }
  132. else if (!tempChar->IsInGroup()) {
  133. tempChar->SetInGroup();
  134. tempChar->SetLeader(tempClient->getCharacterName());
  135. CurrentChar->SetInGroup();
  136. //Creating Group
  137. Group * pTempGroup = new Group;
  138. pTempGroup->Create(tempClient->getCharacterName(),tempChar->getGUID());
  139. //adding leader
  140. pTempGroup->AddMember(tempClient->getCharacterName(), tempChar->getGUID(), 1);
  141. //adding our client
  142. pTempGroup->AddMember(pClient->getCharacterName(), CurrentChar->getGUID(), 0);
  143. WorldServer::getSingleton().AddGroup(pTempGroup);
  144. pTempGroup->SendUpdate();
  145. }
  146. }break;
  147. case CMSG_GROUP_DECLINE:
  148. {
  149. if (!pClient->getCurrentChar()->IsInvited()) {
  150. break;
  151. }
  152. pClient->getCurrentChar()->UnSetInvited();
  153. data.Initialise(strlen(pClient->getCharacterName()) + 1, SMSG_GROUP_DECLINE);
  154. data.writeData(pClient->getCharacterName(), strlen(pClient->getCharacterName()) +1);
  155. WorldServer::getSingleton().SendMessageToPlayer(&data, (char *)pClient->getCurrentChar()->GetGroupLeader());
  156. }break;
  157. case CMSG_GROUP_UNINVITE:
  158. {
  159. std::string membername;
  160. GameClient *tempClient;
  161. Group *tempGroup;
  162. recv_data >> membername;
  163. tempClient = WorldServer::getSingleton().GetClientByName((char *)membername.c_str());
  164. if (tempClient == NULL) {
  165. data.Initialise(sizeof(uint32) + 1 + strlen(membername.c_str()) + sizeof(uint32),SMSG_PARTY_COMMAND_RESULT);
  166. data << uint32( 0x0 );
  167. data.writeData((char *)membername.c_str() , strlen(membername.c_str()) + 1 );
  168. data << uint32( 0x00000001 );
  169. pClient->SendMsg( &data );
  170. break;
  171. }
  172. if  ((!pClient->getCurrentChar()->IsInGroup()) || (strcmp(pClient->getCurrentChar()->GetGroupLeader(), pClient->getCharacterName()) != 0)) {
  173. data.Initialise(sizeof(uint32) + 1 + sizeof(uint32),SMSG_PARTY_COMMAND_RESULT);
  174. data << uint32( 0x0 ) << uint8( 0 );
  175. data << uint32( 0x00000006 );
  176. pClient->SendMsg( &data );
  177. break;
  178. }
  179. if  ((!tempClient->getCurrentChar()->IsInGroup()) || (strcmp(tempClient->getCurrentChar()->GetGroupLeader(),pClient->getCurrentChar()->GetGroupLeader()) != 0)) {
  180. data.Initialise(sizeof(uint32) + 1 + strlen(membername.c_str()) + sizeof(uint32),SMSG_PARTY_COMMAND_RESULT);
  181. data << uint32( 0x0 );
  182. data.writeData((char *)membername.c_str() , strlen(membername.c_str()) + 1 );
  183. data << uint32( 0x00000002 );
  184. pClient->SendMsg( &data );
  185. break;
  186. }
  187. tempGroup = WorldServer::getSingleton().GetGroupByLeader(pClient->getCurrentChar()->GetGroupLeader());
  188. if (tempGroup->DelMember((char *)membername.c_str()) > 1) {
  189. tempGroup->SendUpdate();
  190. }
  191. else {
  192. pClient->getCurrentChar()->UnSetInGroup();
  193. WorldServer::getSingleton().DelGroup(tempGroup);
  194. data.Initialise(0,SMSG_GROUP_DESTROYED);
  195. pClient->SendMsg( &data );
  196. }
  197. tempClient->getCurrentChar()->UnSetInGroup();
  198. data.Initialise(0,SMSG_GROUP_UNINVITE);
  199. tempClient->SendMsg( &data );
  200. }break;
  201. // case CMSG_GROUP_UNINVITE_GUID:
  202. // {
  203. // }break;
  204. case CMSG_GROUP_SET_LEADER:
  205. {
  206. std::string membername;
  207. GameClient *tempClient;
  208. Group *tempGroup;
  209. recv_data >> membername;
  210. tempClient = WorldServer::getSingleton().GetClientByName((char *)membername.c_str());
  211. if (tempClient == NULL) {
  212. data.Initialise(sizeof(uint32) + 1 + strlen(membername.c_str()) + sizeof(uint32),SMSG_PARTY_COMMAND_RESULT);
  213. data << uint32( 0x0 );
  214. data.writeData((char *)membername.c_str() , strlen(membername.c_str()) + 1 );
  215. data << uint32( 0x00000001 );
  216. pClient->SendMsg( &data );
  217. break;
  218. }
  219. if ((!pClient->getCurrentChar()->IsInGroup()) || (strcmp(pClient->getCurrentChar()->GetGroupLeader(), pClient->getCharacterName()) != 0)) {
  220. //error player is not leader
  221. break;
  222. }
  223. if ((!tempClient->getCurrentChar()->IsInGroup()) || (strcmp(tempClient->getCurrentChar()->GetGroupLeader(),pClient->getCharacterName()) != 0)) {
  224. //error player not in group
  225. break;
  226. }
  227. tempGroup = WorldServer::getSingleton().GetGroupByLeader(pClient->getCurrentChar()->GetGroupLeader());
  228. if (tempGroup == NULL) {
  229. //shouldn't get here
  230. break;
  231. }
  232. tempGroup->ChangeLeader((char *)membername.c_str());
  233. }break;
  234. case CMSG_GROUP_DISBAND:
  235. {
  236. /* Group *tempGroup;
  237. if ((!pClient->getCurrentChar()->IsInGroup()) || (strcmp(pClient->getCurrentChar()->GetGroupLeader(), pClient->getCharacterName()) != 0)) {
  238. //error player is not leader
  239. break;
  240. }
  241. tempGroup = WorldServer::getSingleton().GetGroupByLeader(pClient->getCurrentChar()->GetGroupLeader());
  242. if (tempGroup == NULL) {
  243. //shouldn't get here
  244. break;
  245. }
  246. tempGroup->Disband();
  247. WorldServer::getSingleton().DelGroup(tempGroup);
  248. */
  249. if (!pClient->getCurrentChar()->IsInGroup()) {
  250. //error he's not in a group
  251. break;
  252. }
  253. pClient->getCurrentChar()->UnSetInGroup();
  254. Group *tempGroup;
  255. tempGroup = WorldServer::getSingleton().GetGroupByLeader(pClient->getCurrentChar()->GetGroupLeader());
  256. if (tempGroup->DelMember((char *)pClient->getCharacterName()) > 1) {
  257. tempGroup->SendUpdate();
  258. }
  259. else {
  260. tempGroup->Disband();
  261. WorldServer::getSingleton().DelGroup(tempGroup);
  262. data.Initialise(0,SMSG_GROUP_DESTROYED);
  263. pClient->SendMsg( &data );
  264. }
  265. data.clear();
  266. data.Initialise(0,SMSG_GROUP_UNINVITE);
  267. pClient->SendMsg( &data );
  268. }break;
  269. case CMSG_LOOT_METHOD:
  270. {
  271. uint32 lootmethod;
  272. uint32 lootmaster;
  273. Group *tempGroup;
  274. recv_data >> lootmethod >> lootmaster;
  275. tempGroup = WorldServer::getSingleton().GetGroupByLeader(pClient->getCurrentChar()->GetGroupLeader());
  276. if (tempGroup == NULL) {
  277. //shouldn't get here
  278. break;
  279. }
  280. tempGroup->lootmethod = lootmethod;
  281. tempGroup->looterguid = lootmaster;
  282. tempGroup->SendUpdate();
  283. }break;
  284. }
  285. }