stoneharry

Untitled

May 17th, 2011
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 18.93 KB | None | 0 0
  1. Index: arcemu-world/CharacterHandler.cpp
  2. ===================================================================
  3. --- arcemu-world/CharacterHandler.cpp   (revision 4105)
  4. +++ arcemu-world/CharacterHandler.cpp   (working copy)
  5. @@ -1022,6 +1022,7 @@
  6.         plr->SetName(new_name);
  7.         BlueSystemMessageToPlr(plr, "%s changed your name to '%s'.", m_session->GetPlayer()->GetName(), new_name.c_str());
  8.         plr->SaveToDB(false);
  9. +       sWorld.RecacheForAll(2, pi->guid);
  10.     }
  11.     else
  12.     {
  13. Index: arcemu-world/Chat.cpp
  14. ===================================================================
  15. --- arcemu-world/Chat.cpp   (revision 4105)
  16. +++ arcemu-world/Chat.cpp   (working copy)
  17. @@ -81,6 +81,8 @@
  18.         return _arenaCommandTable;
  19.     else if(!stricmp(name, "achieve"))
  20.         return _achievementCommandTable;
  21. +   else if(!stricmp(name, "recache"))
  22. +       return _recacheCommandTable;
  23.     return 0;
  24.  }
  25.  
  26. @@ -216,6 +218,7 @@
  27.     free( _instanceCommandTable );
  28.     free( _arenaCommandTable );
  29.     free( _achievementCommandTable );
  30. +   free( _recacheCommandTable);
  31.     free( _commandTable );
  32.  }
  33.  
  34. @@ -680,6 +683,20 @@
  35.     };
  36.     dupe_command_table(achievementCommandTable, _achievementCommandTable);
  37.  
  38. +   static ChatCommand recacheCommandTable[] =
  39. +   {
  40. +       { "item",    'm', &ChatHandler::HandleRecacheItemCommand, "Recache a item or item range for your current target.",          NULL, 0, 0, 0 },
  41. +       { "gobject", 'm', &ChatHandler::HandleRecacheGameObjectCommand, "Recache a gameobject or gameobject range for your current target.", NULL, 0, 0, 0 },
  42. +       { "creature", 'm', &ChatHandler::HandleRecacheCreatureCommand,    "Recache a creature or creature range for your current target.",      NULL, 0, 0, 0 },
  43. +       { "playername", 'm', &ChatHandler::HandleRecachePlayerNameCommand,    "Recache your currents targets name for self.",      NULL, 0, 0, 0 },
  44. +       { "itemall", 'm', &ChatHandler::HandleRecacheItemForAllCommand,    "Recache an item or item range for everyone online",      NULL, 0, 0, 0 },
  45. +       { "gobjectall", 'm', &ChatHandler::HandleRecacheGameObjectForAllCommand,    "Recache a gameobject or gameobject range for everyone online",      NULL, 0, 0, 0 },
  46. +       { "creatureall", 'm', &ChatHandler::HandleRecacheCreatureForAllCommand,    "Recache a creature or creature range for everyone online.",      NULL, 0, 0, 0 },
  47. +       { "playernameall", 'm', &ChatHandler::HandleRecachePlayerNameForAllCommand,    "Recache your current target's name for everyone online.",      NULL, 0, 0, 0 },
  48. +       { NULL,       '0', NULL,                                           "",                                              NULL, 0, 0, 0 }
  49. +   };
  50. +   dupe_command_table(recacheCommandTable, _recacheCommandTable);
  51. +
  52.     static ChatCommand commandTable[] =
  53.     {
  54.         { "commands",        '0', &ChatHandler::HandleCommandsCommand,                      "Shows commands",                                                                                                                          NULL,                     0, 0, 0 },
  55. @@ -741,6 +758,7 @@
  56.         { "fixscale",        'm', &ChatHandler::HandleFixScaleCommand,                      "",                                                                                                                                        NULL,                     0, 0, 0 },
  57.         { "addtrainerspell", 'm', &ChatHandler::HandleAddTrainerSpellCommand,               "",                                                                                                                                        NULL,                     0, 0, 0 },
  58.         { "achieve",         '0', NULL,                                                     "",                                                                                                                                        achievementCommandTable,  0, 0, 0 },
  59. +       { "recache",         'm', NULL,                                                     "",                                                                                                                                        recacheCommandTable,  0, 0, 0 },
  60.         { NULL,              '0', NULL,                                                     "",                                                                                                                                        NULL,                     0, 0, 0 }
  61.     };
  62.     dupe_command_table(commandTable, _commandTable);
  63. Index: arcemu-world/Chat.h
  64. ===================================================================
  65. --- arcemu-world/Chat.h (revision 4105)
  66. +++ arcemu-world/Chat.h (working copy)
  67. @@ -184,6 +184,7 @@
  68.     ChatCommand* _instanceCommandTable;
  69.     ChatCommand* _arenaCommandTable;
  70.     ChatCommand* _achievementCommandTable;
  71. +   ChatCommand* _recacheCommandTable;
  72.     ChatCommand* _commandTable;
  73.  
  74.     ChatCommand * GetSubCommandTable(const char * name);
  75. @@ -596,6 +597,15 @@
  76.     bool HandleCollisionGetHeight(const char * args, WorldSession * m_session);
  77.     bool HandleAccountMuteCommand(const char * args, WorldSession * m_session);
  78.     bool HandleAccountUnmuteCommand(const char * args, WorldSession * m_session);
  79. +   //"Recaching" Commands
  80. +   bool HandleRecacheItemCommand(const char * args, WorldSession * m_session);
  81. +   bool HandleRecacheCreatureCommand(const char * args, WorldSession * m_session);
  82. +   bool HandleRecachePlayerNameCommand(const char * args, WorldSession * m_session);
  83. +   bool HandleRecacheGameObjectCommand(const char * args, WorldSession * m_session);
  84. +   bool HandleRecacheItemForAllCommand(const char * args, WorldSession * m_session);
  85. +   bool HandleRecacheCreatureForAllCommand(const char * args, WorldSession * m_session);
  86. +   bool HandleRecachePlayerNameForAllCommand(const char * args, WorldSession * m_session);
  87. +   bool HandleRecacheGameObjectForAllCommand(const char * args, WorldSession * m_session);
  88.     /* For skill related GM commands */
  89.     SkillNameMgr *SkillNameManager;
  90.  
  91. Index: arcemu-world/Level3.cpp
  92. ===================================================================
  93. --- arcemu-world/Level3.cpp (revision 4105)
  94. +++ arcemu-world/Level3.cpp (working copy)
  95. @@ -1423,12 +1423,6 @@
  96.  
  97.  bool ChatHandler::HandleDBReloadCommand(const char* args, WorldSession* m_session)
  98.  {
  99. -  
  100. -   sWorld.SendWorldText("Support for reloading tables on the fly was disabled in Arcemu revision 3621. You are seeing this message because apparently reading SVN changelog or using forums search is way over the head of some of our users.", 0 );
  101. -   return true;
  102. -
  103. -   /*
  104. -
  105.     char str[200];
  106.     int ret = 0;
  107.    
  108. @@ -1440,22 +1434,8 @@
  109.     snprintf(str, 200, "%s%s initiated server-side reload of table `%s`. The server may experience some lag while this occurs.",
  110.         MSG_COLOR_LIGHTRED, m_session->GetPlayer()->GetName(), args);
  111.     sWorld.SendWorldText(str, 0);
  112. +   ret = Storage_ReloadTable(args);
  113.  
  114. -   if (0 == stricmp(args, "spell_disable"))
  115. -   {
  116. -       objmgr.ReloadDisabledSpells();
  117. -       ret = 1;
  118. -   } else
  119. -   if (0 == stricmp(args, "vendors"))
  120. -   {
  121. -       objmgr.ReloadVendors();
  122. -       ret = 1;
  123. -   }
  124. -   else
  125. -   {
  126. -       ret = Storage_ReloadTable(args);
  127. -   }
  128. -
  129.     if (ret == 0)
  130.         snprintf(str, 200, "%sDatabase reload failed.", MSG_COLOR_LIGHTRED);
  131.     else
  132. @@ -1463,9 +1443,6 @@
  133.     sWorld.SendWorldText(str, 0);
  134.     sGMLog.writefromsession(m_session, "reloaded table %s", args);
  135.     return true;
  136. -
  137. -   */
  138. -
  139.  }
  140.  
  141.  bool ChatHandler::HandleModifyLevelCommand(const char* args, WorldSession* m_session)
  142. @@ -4086,3 +4063,236 @@
  143.     }
  144.     return true;
  145.  }
  146. +
  147. +//Recache Commands
  148. +
  149. +bool ChatHandler::HandleRecacheItemCommand(const char * args, WorldSession * m_session)
  150. +{
  151. +   if(!args)
  152. +       return false;
  153. +   Player * p = getSelectedChar(m_session);
  154. +   if(p == NULL)
  155. +       return false;
  156. +   uint32 start = 0;
  157. +   uint32 end = 0;
  158. +   if( sscanf(args, "%u %u", &start, &end) != 2)
  159. +       if(sscanf(args, "%u", &start) != 1)
  160. +           return false;
  161. +   if(end !=0)
  162. +   {
  163. +       if(start > end)
  164. +           return false;
  165. +       if(end - start >= 200) //lets limit this
  166. +       {
  167. +           m_session->SystemMessage("You appear to be trying to 'accidently' the server, would you like some help?");
  168. +           return true;
  169. +       }
  170. +       m_session->SystemMessage("Recaching items %u through %u", start, end);
  171. +       for(start; start != end;)
  172. +       {
  173. +           p->GetSession()->RecacheItemInfo(start);
  174. +           start++;
  175. +       }
  176. +   }
  177. +   else
  178. +   {
  179. +       m_session->SystemMessage("Recaching item %u", start);
  180. +       p->GetSession()->RecacheItemInfo(start);
  181. +   }
  182. +   return true;
  183. +}
  184. +
  185. +bool ChatHandler::HandleRecacheCreatureCommand(const char * args, WorldSession * m_session)
  186. +{
  187. +   if(!args)
  188. +       return false;
  189. +   Player * p = getSelectedChar(m_session);
  190. +   if(p == NULL)
  191. +       return false;
  192. +   uint32 start = 0;
  193. +   uint32 end = 0;
  194. +   if( sscanf(args, "%u %u", &start, &end) != 2)
  195. +       if(sscanf(args, "%u", &start) != 1)
  196. +           return false;
  197. +   if(end !=0)
  198. +   {
  199. +       if(start > end)
  200. +           return false;
  201. +       if(end - start >= 200) //lets limit this
  202. +       {
  203. +           m_session->SystemMessage("You appear to be trying to 'accidently' yourself, would you like some help?");
  204. +           return true;
  205. +       }
  206. +       m_session->SystemMessage("Recaching creatures %u through %u", start, end);
  207. +       for(start; start != end;)
  208. +       {
  209. +           p->GetSession()->RecacheCreatureInfo(start);
  210. +           start++;
  211. +       }
  212. +   }
  213. +   else
  214. +   {
  215. +       m_session->SystemMessage("Recaching creature %u", start);
  216. +       p->GetSession()->RecacheCreatureInfo(start);
  217. +   }
  218. +   return true;
  219. +}
  220. +
  221. +bool ChatHandler::HandleRecachePlayerNameCommand(const char * args, WorldSession * m_session)
  222. +{
  223. +   if(!args)
  224. +       return false;
  225. +   Player *p = getSelectedChar(m_session);
  226. +   if(p == NULL)
  227. +       return false;
  228. +   m_session->SystemMessage("Recaching targeted player's name");
  229. +   m_session->RecachePlayerName(p->getPlayerInfo()->guid);
  230. +   return true;
  231. +}
  232. +
  233. +bool ChatHandler::HandleRecacheGameObjectCommand(const char * args, WorldSession * m_session)
  234. +{
  235. +   if(!args)
  236. +       return false;
  237. +   Player * p = getSelectedChar(m_session);
  238. +   if(p == NULL)
  239. +       return false;
  240. +   uint32 start = 0;
  241. +   uint32 end = 0;
  242. +   if( sscanf(args, "%u %u", &start, &end) != 2)
  243. +       if(sscanf(args, "%u", &start) != 1)
  244. +           return false;
  245. +   if(end !=0)
  246. +   {
  247. +       if(start > end)
  248. +           return false;
  249. +       if(end - start >= 200) //lets limit this
  250. +       {
  251. +           m_session->SystemMessage("You appear to be trying to 'accidently' the server, would you like some help?");
  252. +           return true;
  253. +       }
  254. +       m_session->SystemMessage("Recaching gameobjects %u through %u", start, end);
  255. +       for(start; start != end;)
  256. +       {
  257. +           p->GetSession()->RecacheGameObjectInfo(start);
  258. +           start++;
  259. +       }
  260. +   }
  261. +   else
  262. +   {
  263. +       m_session->SystemMessage("Recaching gameobject %u", start);
  264. +       p->GetSession()->RecacheGameObjectInfo(start);
  265. +   }
  266. +   return true;
  267. +}
  268. +
  269. +bool ChatHandler::HandleRecacheItemForAllCommand(const char * args, WorldSession * m_session)
  270. +{
  271. +   if(!args)
  272. +       return false;
  273. +   uint32 start = 0;
  274. +   uint32 end = 0;
  275. +   if( sscanf(args, "%u %u", &start, &end) != 2)
  276. +       if(sscanf(args, "%u", &start) != 1)
  277. +           return false;
  278. +   if(end !=0)
  279. +   {
  280. +       if(start > end)
  281. +           return false;
  282. +       if(end - start >= 200) //lets limit this
  283. +       {
  284. +           m_session->SystemMessage("You appear to be trying to 'accidently' the server, would you like some help?");
  285. +           return true;
  286. +       }
  287. +       m_session->SystemMessage("Recaching items %u through %u", start, end);
  288. +       for(start; start != end;)
  289. +       {
  290. +           sWorld.RecacheForAll(1, start);
  291. +           start++;
  292. +       }
  293. +   }
  294. +   else
  295. +   {
  296. +       m_session->SystemMessage("Recaching item %u", start);
  297. +       sWorld.RecacheForAll(1, start);
  298. +   }
  299. +   return true;
  300. +}
  301. +
  302. +bool ChatHandler::HandleRecacheCreatureForAllCommand(const char * args, WorldSession * m_session)
  303. +{
  304. +   if(!args)
  305. +       return false;
  306. +   uint32 start = 0;
  307. +   uint32 end = 0;
  308. +   if( sscanf(args, "%u %u", &start, &end) != 2)
  309. +       if(sscanf(args, "%u", &start) != 1)
  310. +           return false;
  311. +   if(end !=0)
  312. +   {
  313. +       if(start > end)
  314. +           return false;
  315. +       if(end - start >= 200) //lets limit this
  316. +       {
  317. +           m_session->SystemMessage("You appear to be trying to 'accidently' yourself, would you like some help?");
  318. +           return true;
  319. +       }
  320. +       m_session->SystemMessage("Recaching creatures %u through %u", start, end);
  321. +       for(start; start != end;)
  322. +       {
  323. +           sWorld.RecacheForAll(3, start);
  324. +           start++;
  325. +       }
  326. +   }
  327. +   else
  328. +   {
  329. +       m_session->SystemMessage("Recaching creature %u", start);
  330. +       sWorld.RecacheForAll(3, start);
  331. +   }
  332. +   return true;
  333. +}
  334. +
  335. +bool ChatHandler::HandleRecachePlayerNameForAllCommand(const char * args, WorldSession * m_session)
  336. +{
  337. +   if(!args)
  338. +       return false;
  339. +   Player *p = getSelectedChar(m_session);
  340. +   if(p == NULL)
  341. +       return false;
  342. +   m_session->SystemMessage("Recaching targeted player's name");
  343. +   sWorld.RecacheForAll(2, p->getPlayerInfo()->guid);
  344. +   return true;
  345. +}
  346. +
  347. +bool ChatHandler::HandleRecacheGameObjectForAllCommand(const char * args, WorldSession * m_session)
  348. +{
  349. +   if(!args)
  350. +       return false;
  351. +   uint32 start = 0;
  352. +   uint32 end = 0;
  353. +   if( sscanf(args, "%u %u", &start, &end) != 2)
  354. +       if(sscanf(args, "%u", &start) != 1)
  355. +           return false;
  356. +   if(end !=0)
  357. +   {
  358. +       if(start > end)
  359. +           return false;
  360. +       if(end - start >= 200) //lets limit this
  361. +       {
  362. +           m_session->SystemMessage("You appear to be trying to 'accidently' the server, would you like some help?");
  363. +           return true;
  364. +       }
  365. +       m_session->SystemMessage("Recaching gameobjects %u through %u", start, end);
  366. +       for(start; start != end;)
  367. +       {
  368. +           sWorld.RecacheForAll(4, start);
  369. +           start++;
  370. +       }
  371. +   }
  372. +   else
  373. +   {
  374. +       m_session->SystemMessage("Recaching gameobject %u", start);
  375. +       sWorld.RecacheForAll(4, start);
  376. +   }
  377. +   return true;
  378. +}
  379. Index: arcemu-world/ObjectStorage.cpp
  380. ===================================================================
  381. --- arcemu-world/ObjectStorage.cpp  (revision 4105)
  382. +++ arcemu-world/ObjectStorage.cpp  (working copy)
  383. @@ -626,14 +626,14 @@
  384.  bool Storage_ReloadTable(const char * TableName)
  385.  {
  386.     // bur: mah god this is ugly :P
  387. -   /*if(!stricmp(TableName, "items"))                  // Items
  388. +   if(!stricmp(TableName, "items"))                    // Items
  389.         ItemPrototypeStorage.Reload();
  390.     else if(!stricmp(TableName, "creature_proto"))      // Creature Proto
  391.         CreatureProtoStorage.Reload();
  392.     else if(!stricmp(TableName, "creature_names"))      // Creature Names
  393.         CreatureNameStorage.Reload();
  394.     else if(!stricmp(TableName, "gameobject_names"))    // GO Names
  395. -       GameObjectNameStorage.Reload();*/
  396. +       GameObjectNameStorage.Reload();
  397.     if(!stricmp(TableName, "areatriggers"))     // Areatriggers
  398.         AreaTriggerStorage.Reload();
  399.     else if(!stricmp(TableName, "itempages"))           // Item Pages
  400. @@ -642,8 +642,8 @@
  401.         WorldStringTableStorage.Reload();
  402.     else if(!stricmp(TableName, "worldbroadcast"))          // wb
  403.         WorldBroadCastStorage.Reload();
  404. -   /*else if(!stricmp(TableName, "quests"))                // Quests
  405. -       QuestStorage.Reload();*/
  406. +   else if(!stricmp(TableName, "quests"))              // Quests
  407. +       QuestStorage.Reload();
  408.     else if(!stricmp(TableName, "npc_text"))            // NPC Text Storage
  409.         NpcTextStorage.Reload();
  410.     else if(!stricmp(TableName, "fishing"))             // Fishing Zones
  411. @@ -658,6 +658,10 @@
  412.         ZoneGuardStorage.Reload();
  413.     else if(!stricmp(TableName, "unit_display_sizes"))
  414.         UnitModelSizeStorage.Reload();
  415. +   else if (!(TableName, "spell_disable"))
  416. +       objmgr.ReloadDisabledSpells();
  417. +   else if (!(TableName, "vendors"))
  418. +       objmgr.ReloadVendors();
  419.     else if(!stricmp(TableName, "command_overrides"))   // Command Overrides
  420.     {
  421.         CommandTableStorage::getSingleton().Dealloc();
  422. Index: arcemu-world/SpellHandler.cpp
  423. ===================================================================
  424. --- arcemu-world/SpellHandler.cpp   (revision 4105)
  425. +++ arcemu-world/SpellHandler.cpp   (working copy)
  426. @@ -100,15 +100,9 @@
  427.      //
  428.      // Altough this could also happen after a DB update
  429.      // if he/she didn't delete his/her cache.
  430. -    if( found == false ){
  431. -        
  432. -        this->Disconnect();
  433. -        Anticheat_Log->writefromsession( this, "Player tried to use an item with a spell that didn't match the spell in the database." );
  434. -        Anticheat_Log->writefromsession( this, "Possibly corrupted or intentionally altered itemcache.wdb" );
  435. -        Anticheat_Log->writefromsession( this, "Itemid: %lu", itemProto->ItemId );
  436. -        Anticheat_Log->writefromsession( this, "Spellid: %lu", spellId );
  437. -        Anticheat_Log->writefromsession( this, "Player was disconnected" );
  438. -
  439. +    if( found == false )
  440. +   {
  441. +       RecacheItemInfo(tmpItem->GetEntry());
  442.         return;
  443.     }
  444.  
  445. Index: arcemu-world/World.cpp
  446. ===================================================================
  447. --- arcemu-world/World.cpp  (revision 4105)
  448. +++ arcemu-world/World.cpp  (working copy)
  449. @@ -2255,4 +2255,38 @@
  450.     data << uint32( areaid );
  451.    
  452.     SendFactionMessage( &data, team );
  453. +}
  454. +
  455. +void World::RecacheForAll(uint8 type, uint32 arg)
  456. +{
  457. +   m_sessionlock.AcquireReadLock();
  458. +   SessionMap::iterator itr;
  459. +   for (itr = m_sessions.begin(); itr != m_sessions.end(); itr++)
  460. +   {
  461. +       if (itr->second->GetPlayer() && itr->second->GetPlayer()->IsInWorld())
  462. +       {
  463. +           switch(type)
  464. +           {
  465. +               case 1:
  466. +               {
  467. +                   itr->second->RecacheItemInfo(arg);
  468. +               }break;
  469. +               case 2:
  470. +               {
  471. +                   itr->second->RecachePlayerName((uint64)arg);
  472. +               }break;
  473. +               case 3:
  474. +               {
  475. +                   itr->second->RecacheCreatureInfo(arg);
  476. +               }break;
  477. +               case 4:
  478. +               {
  479. +                   itr->second->RecacheGameObjectInfo(arg);
  480. +               }break;
  481. +               default:
  482. +                   sLog.outError("Unknown recache type %u", type);
  483. +           }
  484. +       }
  485. +   }
  486. +   m_sessionlock.ReleaseReadLock();
  487. }
  488. \ No newline at end of file
  489. Index: arcemu-world/World.h
  490. ===================================================================
  491. --- arcemu-world/World.h    (revision 4105)
  492. +++ arcemu-world/World.h    (working copy)
  493. @@ -711,6 +711,8 @@
  494.     static float m_movementCompressThresholdCreatures;
  495.     static uint32 m_movementCompressRate;
  496.     static uint32 m_movementCompressInterval;
  497. +
  498. +   void RecacheForAll(uint8 type, uint32 arg);
  499. /*
  500.  * Traffic meter stuff
  501.  */
  502. Index: arcemu-world/WorldSession.h
  503. ===================================================================
  504. --- arcemu-world/WorldSession.h (revision 4105)
  505. +++ arcemu-world/WorldSession.h (working copy)
  506. @@ -773,6 +773,48 @@
  507.     float m_wLevel; // Level of water the player is currently in
  508.     bool m_bIsWLevelSet; // Does the m_wLevel variable contain up-to-date information about water level?
  509.  
  510. +   //"Recaching" Things
  511. +
  512. +   //Item Entry
  513. +   void RecacheItemInfo(uint32 entry)
  514. +   {
  515. +       WorldPacket data(CMSG_ITEM_QUERY_SINGLE, 4);
  516. +       data << uint32(entry);
  517. +       HandleItemQuerySingleOpcode(data);
  518. +
  519. +       data.clear();
  520. +       data.Initialize(CMSG_ITEM_QUERY_SINGLE);
  521. +       data.reserve(12);
  522. +       data << uint32(entry) << uint64(0);
  523. +       HandleItemNameQueryOpcode(data);
  524. +   }
  525. +
  526. +   //Player Low Guid
  527. +   void RecachePlayerName(uint64 guid)
  528. +   {
  529. +       WorldPacket data(CMSG_NAME_QUERY, 8);
  530. +       data << guid;
  531. +       HandleNameQueryOpcode(data);
  532. +   }
  533. +
  534. +   // Creature Entry
  535. +   void RecacheCreatureInfo(uint32 entry)
  536. +   {
  537. +       WorldPacket data(CMSG_CREATURE_QUERY, 12);
  538. +       data << entry;
  539. +       data << (uint64)1; //Opcode handler doesn't use guid so just send 1
  540. +       HandleCreatureQueryOpcode(data);
  541. +   }
  542. +
  543. +   // GameObject Entry
  544. +   void RecacheGameObjectInfo(uint32 entry)
  545. +   {
  546. +       WorldPacket data(CMSG_GAMEOBJECT_QUERY, 12);
  547. +       data << entry;
  548. +       data << (uint64)1; //Opcode handler doesn't use guid so just send 1
  549. +       HandleGameObjectQueryOpcode(data);
  550. +   }
  551. +
  552. private:
  553.     friend class Player;
  554.     Player *_player;
Advertisement
Add Comment
Please, Sign In to add comment