Guest User

Untitled

a guest
Nov 19th, 2014
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 31.31 KB | None | 0 0
  1. //After
  2.  
  3. // Helping templates to add dispatcher tasks
  4.  
  5. //Add this
  6.  
  7. bool debug(){
  8. return true;
  9. }
  10.  
  11. //Replace
  12.  
  13. ProtocolGame::ProtocolGame(Connection_ptr connection) :
  14. Protocol(connection),
  15. player(nullptr),
  16. eventConnect(0),
  17. // version(CLIENT_VERSION_MIN),
  18. m_challengeTimestamp(0),
  19. m_challengeRandom(0),
  20. m_debugAssertSent(false),
  21. m_acceptPackets(false)
  22. {
  23. //
  24. }
  25.  
  26. //With
  27.  
  28. ProtocolGame::ProtocolGame(Connection_ptr connection) :
  29. Protocol(connection),
  30. player(nullptr),
  31. eventConnect(0),
  32. // version(CLIENT_VERSION_MIN),
  33. m_challengeTimestamp(0),
  34. m_challengeRandom(0),
  35. m_debugAssertSent(false),
  36. m_acceptPackets(false)
  37. {
  38. original = true;
  39. }
  40.  
  41. //Replace
  42.  
  43. void ProtocolGame::releaseProtocol()
  44. {
  45. //dispatcher thread
  46. if (player && player->client == this) {
  47. player->client = nullptr;
  48. }
  49. Protocol::releaseProtocol();
  50. }
  51.  
  52. //With
  53.  
  54. void ProtocolGame::releaseProtocol()
  55. {
  56. if (player) {
  57. for (auto it : player->cSpectators) {
  58. std::stringstream ss;
  59. ss << "Spectator " << player->cast.specId;
  60. it.second->viewerName = ss.str().c_str();
  61. player->sendChannelEvent(player->cast.mCastChannelId, viewerName, CHANNELEVENT_LEAVE);
  62. return;
  63. }
  64. }
  65.  
  66. //dispatcher thread
  67. if (original) {
  68. if (player && player->client == this) {
  69. player->client = nullptr;
  70. }
  71. }
  72. Protocol::releaseProtocol();
  73. }
  74.  
  75. //Replace
  76.  
  77. void ProtocolGame::deleteProtocolTask()
  78. {
  79. //dispatcher thread
  80. if (player) {
  81. g_game.ReleaseCreature(player);
  82. player = nullptr;
  83. }
  84.  
  85. Protocol::deleteProtocolTask();
  86. }
  87.  
  88. //With
  89.  
  90. void ProtocolGame::deleteProtocolTask()
  91. {
  92. //dispatcher thread
  93. if (original && player) {
  94. g_game.ReleaseCreature(player);
  95. player = nullptr;
  96. }
  97. else if (!original)
  98. player = nullptr;
  99.  
  100. Protocol::deleteProtocolTask();
  101. }
  102.  
  103. //After
  104.  
  105. Player* _player = g_game.getPlayerByName(name);
  106.  
  107. //Add this
  108.  
  109. if (accountId == 0)
  110. if (!_player || !_player->cast.isCasting) {
  111. disconnectClient("This player is currently not casting.");
  112. return;
  113. }
  114.  
  115. //Replace
  116.  
  117. if (eventConnect != 0 || !g_config.getBoolean(ConfigManager::REPLACE_KICK_ON_LOGIN)) {
  118.  
  119. //With
  120.  
  121. if (accountId != 0 && (eventConnect != 0 || !g_config.getBoolean(ConfigManager::REPLACE_KICK_ON_LOGIN))) {
  122.  
  123. //Replace
  124.  
  125. if (_player->client) {
  126. _player->disconnect();
  127. _player->isConnecting = true;
  128.  
  129. addRef();
  130. eventConnect = g_scheduler.addEvent(createSchedulerTask(1000, std::bind(&ProtocolGame::connect, this, _player->getID(), operatingSystem)));
  131. return;
  132. }
  133.  
  134. //With
  135.  
  136. if (accountId != 0 && _player->client) {
  137. _player->disconnect();
  138. _player->isConnecting = true;
  139.  
  140. addRef();
  141. eventConnect = g_scheduler.addEvent(createSchedulerTask(1000, std::bind(&ProtocolGame::connect, this, _player->getID(), operatingSystem)));
  142. return;
  143. }
  144.  
  145. //Before
  146.  
  147. addRef();
  148. connect(_player->getID(), operatingSystem);
  149.  
  150. //Add this
  151.  
  152. if (accountId == 0) {
  153. addRef();
  154. eventConnect = g_scheduler.addEvent(createSchedulerTask(1000, std::bind(&ProtocolGame::connectCast, this, _player->getID(), operatingSystem)));
  155. return;
  156. }
  157.  
  158. //Before
  159.  
  160. void ProtocolGame::connect(uint32_t playerId, OperatingSystem_t operatingSystem)
  161.  
  162. //Add this
  163.  
  164. void ProtocolGame::connectCast(uint32_t playerId, OperatingSystem_t operatingSystem)
  165. {
  166. UNREFERENCED_PARAMETER(operatingSystem);
  167. Player* _player = g_game.getPlayerByID(playerId);
  168. if (!_player || !_player->cast.isCasting) {
  169. disconnect();
  170. return;
  171. }
  172.  
  173. original = false;
  174. eventConnect = 0;
  175. _player->addCastViewer(this);
  176. m_acceptPackets = true;
  177. player = _player;
  178.  
  179. sendAddCreature(_player, _player->getPosition(), _player->getTile()->__getIndexOfThing(_player), false);
  180. if (_player->cast.mCastChannelId != -1)
  181. sendCreatePrivateChannel(_player->cast.mCastChannelId, "Spectator Chat");
  182.  
  183. for (const auto& it : player->openContainers) {
  184. const OpenContainer& openContainer = it.second;
  185. sendContainer(it.first, openContainer.container, openContainer.container->hasParent(), openContainer.index);
  186. }
  187.  
  188. /*player->lastIP = player->getIP();
  189. player->lastLoginSaved = std::max<time_t>(time(nullptr), player->lastLoginSaved + 1);*/
  190.  
  191.  
  192. }
  193.  
  194. //Replace
  195.  
  196. void ProtocolGame::logout(bool displayEffect, bool forced)
  197. {
  198. //dispatcher thread
  199. if (!player) {
  200. return;
  201. }
  202.  
  203. if (!player->isRemoved()) {
  204. if (!forced) {
  205. if (!player->isAccessPlayer()) {
  206. if (player->getTile()->hasFlag(TILESTATE_NOLOGOUT)) {
  207. player->sendCancelMessage(RET_YOUCANNOTLOGOUTHERE);
  208. return;
  209. }
  210.  
  211. if (!player->getTile()->hasFlag(TILESTATE_PROTECTIONZONE) && player->hasCondition(CONDITION_INFIGHT)) {
  212. player->sendCancelMessage(RET_YOUMAYNOTLOGOUTDURINGAFIGHT);
  213. return;
  214. }
  215. }
  216.  
  217. //scripting event - onLogout
  218. if (!g_creatureEvents->playerLogout(player)) {
  219. //Let the script handle the error message
  220. return;
  221. }
  222. }
  223.  
  224. if (displayEffect && player->getHealth() > 0) {
  225. g_game.addMagicEffect(player->getPosition(), CONST_ME_POFF);
  226. }
  227. }
  228.  
  229. if (Connection_ptr connection = getConnection()) {
  230. connection->closeConnection();
  231. }
  232.  
  233. g_game.removeCreature(player);
  234. }
  235.  
  236. //With
  237.  
  238. void ProtocolGame::logout(bool displayEffect, bool forced)
  239. {
  240. //dispatcher thread
  241. if (original)
  242. {
  243.  
  244. if (!player) {
  245. return;
  246. }
  247.  
  248. if (!player->isRemoved()) {
  249. if (!forced) {
  250. if (!player->isAccessPlayer()) {
  251. if (player->getTile()->hasFlag(TILESTATE_NOLOGOUT)) {
  252. player->sendCancelMessage(RET_YOUCANNOTLOGOUTHERE);
  253. return;
  254. }
  255.  
  256. if (!player->getTile()->hasFlag(TILESTATE_PROTECTIONZONE) && player->hasCondition(CONDITION_INFIGHT)) {
  257. player->sendCancelMessage(RET_YOUMAYNOTLOGOUTDURINGAFIGHT);
  258. return;
  259. }
  260. }
  261.  
  262. //scripting event - onLogout
  263. if (!g_creatureEvents->playerLogout(player)) {
  264. //Let the script handle the error message
  265. return;
  266. }
  267. }
  268.  
  269. if (displayEffect && player->getHealth() > 0) {
  270. g_game.addMagicEffect(player->getPosition(), CONST_ME_POFF);
  271. }
  272. if (original)
  273. player->kickCastViewers();
  274. }
  275.  
  276. if (Connection_ptr connection = getConnection()) {
  277. connection->closeConnection();
  278. }
  279.  
  280. g_game.removeCreature(player);
  281. }
  282. else
  283. {
  284. if (Connection_ptr connection = getConnection()) {
  285. connection->closeConnection();
  286. }
  287. }
  288. }
  289.  
  290. //After
  291.  
  292. void ProtocolGame::onRecvFirstMessage(NetworkMessage& msg)
  293. {
  294.  
  295. //Add this
  296.  
  297. bool isCast = false;
  298.  
  299. //After
  300.  
  301. std::string password = msg.GetString();
  302.  
  303. //Add this
  304.  
  305. if (accountName.empty()) {
  306. isCast = true;
  307. }
  308.  
  309. //Replace
  310.  
  311. if (accountName.empty()) {
  312. dispatchDisconnectClient("You must enter your account name.");
  313. return;
  314. }
  315.  
  316. //With
  317.  
  318. if (!isCast && accountName.empty()) {
  319. dispatchDisconnectClient("You must enter your account name.");
  320. return;
  321. }
  322.  
  323. //Replace
  324.  
  325. if (accountId == 0) {
  326. dispatchDisconnectClient("Account name or password is not correct.");
  327. return;
  328. }
  329.  
  330. //With
  331.  
  332. if (!isCast && accountId == 0) {
  333. dispatchDisconnectClient("Account name or password is not correct.");
  334. return;
  335. }
  336.  
  337. //Replace
  338.  
  339. void ProtocolGame::parsePacket(NetworkMessage& msg)
  340. {
  341. if (!m_acceptPackets || g_game.getGameState() == GAME_STATE_SHUTDOWN || msg.getMessageLength() <= 0) {
  342. return;
  343. }
  344.  
  345. uint8_t recvbyte = msg.GetByte();
  346.  
  347. if (!player) {
  348. if (recvbyte == 0x0F) {
  349. disconnect();
  350. }
  351.  
  352. return;
  353. }
  354.  
  355. //a dead player can not performs actions
  356. if (player->isRemoved() || player->getHealth() <= 0) {
  357. if (recvbyte == 0x0F) {
  358. disconnect();
  359. return;
  360. }
  361.  
  362. if (recvbyte != 0x14) {
  363. return;
  364. }
  365. }
  366.  
  367. switch (recvbyte) {
  368. case 0x14: g_dispatcher.addTask(createTask(std::bind(&ProtocolGame::logout, this, true, false))); break;
  369. case 0x1D: addGameTask(&Game::playerReceivePingBack, player->getID()); break;
  370. case 0x1E: addGameTask(&Game::playerReceivePing, player->getID()); break;
  371. case 0x32: parseExtendedOpcode(msg); break; //otclient extended opcode
  372. case 0x64: parseAutoWalk(msg); break;
  373. case 0x65: addGameTask(&Game::playerMove, player->getID(), NORTH); break;
  374. case 0x66: addGameTask(&Game::playerMove, player->getID(), EAST); break;
  375. case 0x67: addGameTask(&Game::playerMove, player->getID(), SOUTH); break;
  376. case 0x68: addGameTask(&Game::playerMove, player->getID(), WEST); break;
  377. case 0x69: addGameTask(&Game::playerStopAutoWalk, player->getID()); break;
  378. case 0x6A: addGameTask(&Game::playerMove, player->getID(), NORTHEAST); break;
  379. case 0x6B: addGameTask(&Game::playerMove, player->getID(), SOUTHEAST); break;
  380. case 0x6C: addGameTask(&Game::playerMove, player->getID(), SOUTHWEST); break;
  381. case 0x6D: addGameTask(&Game::playerMove, player->getID(), NORTHWEST); break;
  382. case 0x6F: addGameTaskTimed(DISPATCHER_TASK_EXPIRATION, &Game::playerTurn, player->getID(), NORTH); break;
  383. case 0x70: addGameTaskTimed(DISPATCHER_TASK_EXPIRATION, &Game::playerTurn, player->getID(), EAST); break;
  384. case 0x71: addGameTaskTimed(DISPATCHER_TASK_EXPIRATION, &Game::playerTurn, player->getID(), SOUTH); break;
  385. case 0x72: addGameTaskTimed(DISPATCHER_TASK_EXPIRATION, &Game::playerTurn, player->getID(), WEST); break;
  386. case 0x78: parseThrow(msg); break;
  387. case 0x79: parseLookInShop(msg); break;
  388. case 0x7A: parsePlayerPurchase(msg); break;
  389. case 0x7B: parsePlayerSale(msg); break;
  390. case 0x7C: addGameTask(&Game::playerCloseShop, player->getID()); break;
  391. case 0x7D: parseRequestTrade(msg); break;
  392. case 0x7E: parseLookInTrade(msg); break;
  393. case 0x7F: addGameTask(&Game::playerAcceptTrade, player->getID()); break;
  394. case 0x80: addGameTask(&Game::playerCloseTrade, player->getID()); break;
  395. case 0x82: parseUseItem(msg); break;
  396. case 0x83: parseUseItemEx(msg); break;
  397. case 0x84: parseUseWithCreature(msg); break;
  398. case 0x85: parseRotateItem(msg); break;
  399. case 0x87: parseCloseContainer(msg); break;
  400. case 0x88: parseUpArrowContainer(msg); break;
  401. case 0x89: parseTextWindow(msg); break;
  402. case 0x8A: parseHouseWindow(msg); break;
  403. case 0x8C: parseLookAt(msg); break;
  404. case 0x8D: parseLookInBattleList(msg); break;
  405. case 0x8E: /* join aggression */ break;
  406. case 0x96: parseSay(msg); break;
  407. case 0x97: addGameTask(&Game::playerRequestChannels, player->getID()); break;
  408. case 0x98: parseOpenChannel(msg); break;
  409. case 0x99: parseCloseChannel(msg); break;
  410. case 0x9A: parseOpenPrivateChannel(msg); break;
  411. case 0x9E: addGameTask(&Game::playerCloseNpcChannel, player->getID()); break;
  412. case 0xA0: parseFightModes(msg); break;
  413. case 0xA1: parseAttack(msg); break;
  414. case 0xA2: parseFollow(msg); break;
  415. case 0xA3: parseInviteToParty(msg); break;
  416. case 0xA4: parseJoinParty(msg); break;
  417. case 0xA5: parseRevokePartyInvite(msg); break;
  418. case 0xA6: parsePassPartyLeadership(msg); break;
  419. case 0xA7: addGameTask(&Game::playerLeaveParty, player->getID()); break;
  420. case 0xA8: parseEnableSharedPartyExperience(msg); break;
  421. case 0xAA: addGameTask(&Game::playerCreatePrivateChannel, player->getID()); break;
  422. case 0xAB: parseChannelInvite(msg); break;
  423. case 0xAC: parseChannelExclude(msg); break;
  424. case 0xBE: addGameTask(&Game::playerCancelAttackAndFollow, player->getID()); break;
  425. case 0xC9: /* update tile */ break;
  426. case 0xCA: parseUpdateContainer(msg); break;
  427. case 0xCB: parseBrowseField(msg); break;
  428. case 0xCC: parseSeekInContainer(msg); break;
  429. case 0xD2: addGameTask(&Game::playerRequestOutfit, player->getID()); break;
  430. case 0xD3: parseSetOutfit(msg); break;
  431. case 0xD4: parseToggleMount(msg); break;
  432. case 0xDC: parseAddVip(msg); break;
  433. case 0xDD: parseRemoveVip(msg); break;
  434. case 0xDE: parseEditVip(msg); break;
  435. case 0xE6: parseBugReport(msg); break;
  436. case 0xE7: /* thank you */ break;
  437. case 0xE8: parseDebugAssert(msg); break;
  438. case 0xF0: addGameTaskTimed(DISPATCHER_TASK_EXPIRATION, &Game::playerShowQuestLog, player->getID()); break;
  439. case 0xF1: parseQuestLine(msg); break;
  440. case 0xF2: /* rule violation report */ break;
  441. case 0xF3: /* get object info */ break;
  442. case 0xF4: parseMarketLeave(); break;
  443. case 0xF5: parseMarketBrowse(msg); break;
  444. case 0xF6: parseMarketCreateOffer(msg); break;
  445. case 0xF7: parseMarketCancelOffer(msg); break;
  446. case 0xF8: parseMarketAcceptOffer(msg); break;
  447. case 0xF9: parseModalWindowAnswer(msg); break;
  448.  
  449. default:
  450. // std::cout << "Player: " << player->getName() << " sent an unknown packet header: 0x" << std::hex << (int16_t)recvbyte << std::dec << "!" << std::endl;
  451. break;
  452. }
  453.  
  454. if (msg.isOverrun()) {
  455. disconnect();
  456. }
  457. }
  458.  
  459. //With
  460.  
  461. void ProtocolGame::parsePacket(NetworkMessage& msg)
  462. {
  463. if (!m_acceptPackets || g_game.getGameState() == GAME_STATE_SHUTDOWN || msg.getMessageLength() <= 0) {
  464. return;
  465. }
  466.  
  467. uint8_t recvbyte = msg.GetByte();
  468.  
  469. if (!player) {
  470. if (recvbyte == 0x0F) {
  471. disconnect();
  472. }
  473.  
  474. return;
  475. }
  476.  
  477. //a dead player can not performs actions
  478. if (player->isRemoved() || player->getHealth() <= 0) {
  479. if (recvbyte == 0x0F) {
  480. disconnect();
  481. return;
  482. }
  483.  
  484. if (recvbyte != 0x14) {
  485. return;
  486. }
  487. }
  488.  
  489. if (!original)
  490. switch (recvbyte) {
  491. case 0x14: g_dispatcher.addTask(createTask(std::bind(&ProtocolGame::logout, this, true, false))); break;
  492. case 0x1D: addGameTask(&Game::playerReceivePingBack, player->getID()); break;
  493. case 0x1E: addGameTask(&Game::playerReceivePing, player->getID()); break;
  494. case 0x32: parseExtendedOpcode(msg); break; //otclient extended opcode
  495. case 0x64: sendCancelWalk(); break;
  496. case 0x65: sendCancelWalk(); break;
  497. case 0x66: sendCancelWalk(); break;
  498. case 0x67: sendCancelWalk(); break;
  499. case 0x68: sendCancelWalk(); break;
  500. case 0x69: sendCancelWalk(); break;
  501. case 0x6A: sendCancelWalk(); break;
  502. case 0x6B: sendCancelWalk(); break;
  503. case 0x6C: sendCancelWalk(); break;
  504. case 0x6D: sendCancelWalk(); break;
  505. //case 0x6F: addGameTaskTimed(DISPATCHER_TASK_EXPIRATION, &Game::playerTurn, player->getID(), NORTH); break;
  506. //case 0x70: addGameTaskTimed(DISPATCHER_TASK_EXPIRATION, &Game::playerTurn, player->getID(), EAST); break;
  507. //case 0x71: addGameTaskTimed(DISPATCHER_TASK_EXPIRATION, &Game::playerTurn, player->getID(), SOUTH); break;
  508. //case 0x72: addGameTaskTimed(DISPATCHER_TASK_EXPIRATION, &Game::playerTurn, player->getID(), WEST); break;
  509. //case 0x78: parseThrow(msg); break;
  510. //case 0x79: parseLookInShop(msg); break;
  511. //case 0x7A: parsePlayerPurchase(msg); break;
  512. //case 0x7B: parsePlayerSale(msg); break;
  513. //case 0x7C: addGameTask(&Game::playerCloseShop, player->getID()); break;
  514. //case 0x7D: parseRequestTrade(msg); break;
  515. //case 0x7E: parseLookInTrade(msg); break;
  516. //case 0x7F: addGameTask(&Game::playerAcceptTrade, player->getID()); break;
  517. //case 0x80: addGameTask(&Game::playerCloseTrade, player->getID()); break;
  518. //case 0x82: parseUseItem(msg); break;
  519. //case 0x83: parseUseItemEx(msg); break;
  520. //case 0x84: parseUseWithCreature(msg); break;
  521. //case 0x85: parseRotateItem(msg); break;
  522. //case 0x87: parseCloseContainer(msg); break;
  523. //case 0x88: parseUpArrowContainer(msg); break;
  524. //case 0x89: parseTextWindow(msg); break;
  525. //case 0x8A: parseHouseWindow(msg); break;
  526. //case 0x8C: parseLookAt(msg); break;
  527. //case 0x8D: parseLookInBattleList(msg); break;
  528. //case 0x8E: /* join aggression */ break;
  529. case 0x96: parseSay(msg); break;
  530. //case 0x97: addGameTask(&Game::playerRequestChannels, player->getID()); break;
  531. // case 0x98: parseOpenChannel(msg); break;
  532. case 0x99:{
  533. int32_t channelId = msg.get<uint16_t>();
  534. if (this->player->cast.mCastChannelId == channelId)
  535. this->sendCreatePrivateChannel(this->player->cast.mCastChannelId, "Spectator Chat");
  536. // parseCloseChannel(msg);
  537.  
  538. }
  539. break;
  540. //case 0x9A: parseOpenPrivateChannel(msg); break;
  541. //case 0x9E: addGameTask(&Game::playerCloseNpcChannel, player->getID()); break;
  542. //case 0xA0: parseFightModes(msg); break;
  543. //case 0xA1: parseAttack(msg); break;
  544. //case 0xA2: parseFollow(msg); break;
  545. //case 0xA3: parseInviteToParty(msg); break;
  546. //case 0xA4: parseJoinParty(msg); break;
  547. //case 0xA5: parseRevokePartyInvite(msg); break;
  548. //case 0xA6: parsePassPartyLeadership(msg); break;
  549. //case 0xA7: addGameTask(&Game::playerLeaveParty, player->getID()); break;
  550. //case 0xA8: parseEnableSharedPartyExperience(msg); break;
  551. //case 0xAA: addGameTask(&Game::playerCreatePrivateChannel, player->getID()); break;
  552. //case 0xAB: parseChannelInvite(msg); break;
  553. //case 0xAC: parseChannelExclude(msg); break;
  554. //case 0xBE: addGameTask(&Game::playerCancelAttackAndFollow, player->getID()); break;
  555. case 0xC9: /* update tile */ break;
  556. //case 0xCA: parseUpdateContainer(msg); break;
  557. //case 0xCB: parseBrowseField(msg); break;
  558. //case 0xCC: parseSeekInContainer(msg); break;
  559. //case 0xD2: addGameTask(&Game::playerRequestOutfit, player->getID()); break;
  560. //case 0xD3: parseSetOutfit(msg); break;
  561. //case 0xD4: parseToggleMount(msg); break;
  562. //case 0xDC: parseAddVip(msg); break;
  563. //case 0xDD: parseRemoveVip(msg); break;
  564. //case 0xDE: parseEditVip(msg); break;
  565. //case 0xE6: parseBugReport(msg); break;
  566. //case 0xE7: /* thank you */ break;
  567. //case 0xE8: parseDebugAssert(msg); break;
  568. //case 0xF0: addGameTaskTimed(DISPATCHER_TASK_EXPIRATION, &Game::playerShowQuestLog, player->getID()); break;
  569. //case 0xF1: parseQuestLine(msg); break;
  570. //case 0xF2: /* rule violation report */ break;
  571. //case 0xF3: /* get object info */ break;
  572. //case 0xF4: parseMarketLeave(); break;
  573. //case 0xF5: parseMarketBrowse(msg); break;
  574. //case 0xF6: parseMarketCreateOffer(msg); break;
  575. //case 0xF7: parseMarketCancelOffer(msg); break;
  576. //case 0xF8: parseMarketAcceptOffer(msg); break;
  577. //case 0xF9: parseModalWindowAnswer(msg); break;
  578.  
  579. default:
  580. // std::cout << "Player: " << player->getName() << " sent an unknown packet header: 0x" << std::hex << (int16_t)recvbyte << std::dec << "!" << std::endl;
  581. break;
  582. }
  583. else
  584. switch (recvbyte) {
  585. case 0x14: g_dispatcher.addTask(createTask(std::bind(&ProtocolGame::logout, this, true, false))); break;
  586. case 0x1D: addGameTask(&Game::playerReceivePingBack, player->getID()); break;
  587. case 0x1E: addGameTask(&Game::playerReceivePing, player->getID()); break;
  588. case 0x32: parseExtendedOpcode(msg); break; //otclient extended opcode
  589. case 0x64: parseAutoWalk(msg); break;
  590. case 0x65: addGameTask(&Game::playerMove, player->getID(), NORTH); break;
  591. case 0x66: addGameTask(&Game::playerMove, player->getID(), EAST); break;
  592. case 0x67: addGameTask(&Game::playerMove, player->getID(), SOUTH); break;
  593. case 0x68: addGameTask(&Game::playerMove, player->getID(), WEST); break;
  594. case 0x69: addGameTask(&Game::playerStopAutoWalk, player->getID()); break;
  595. case 0x6A: addGameTask(&Game::playerMove, player->getID(), NORTHEAST); break;
  596. case 0x6B: addGameTask(&Game::playerMove, player->getID(), SOUTHEAST); break;
  597. case 0x6C: addGameTask(&Game::playerMove, player->getID(), SOUTHWEST); break;
  598. case 0x6D: addGameTask(&Game::playerMove, player->getID(), NORTHWEST); break;
  599. case 0x6F: addGameTaskTimed(DISPATCHER_TASK_EXPIRATION, &Game::playerTurn, player->getID(), NORTH); break;
  600. case 0x70: addGameTaskTimed(DISPATCHER_TASK_EXPIRATION, &Game::playerTurn, player->getID(), EAST); break;
  601. case 0x71: addGameTaskTimed(DISPATCHER_TASK_EXPIRATION, &Game::playerTurn, player->getID(), SOUTH); break;
  602. case 0x72: addGameTaskTimed(DISPATCHER_TASK_EXPIRATION, &Game::playerTurn, player->getID(), WEST); break;
  603. case 0x78: parseThrow(msg); break;
  604. case 0x79: parseLookInShop(msg); break;
  605. case 0x7A: parsePlayerPurchase(msg); break;
  606. case 0x7B: parsePlayerSale(msg); break;
  607. case 0x7C: addGameTask(&Game::playerCloseShop, player->getID()); break;
  608. case 0x7D: parseRequestTrade(msg); break;
  609. case 0x7E: parseLookInTrade(msg); break;
  610. case 0x7F: addGameTask(&Game::playerAcceptTrade, player->getID()); break;
  611. case 0x80: addGameTask(&Game::playerCloseTrade, player->getID()); break;
  612. case 0x82: parseUseItem(msg); break;
  613. case 0x83: parseUseItemEx(msg); break;
  614. case 0x84: parseUseWithCreature(msg); break;
  615. case 0x85: parseRotateItem(msg); break;
  616. case 0x87: parseCloseContainer(msg); break;
  617. case 0x88: parseUpArrowContainer(msg); break;
  618. case 0x89: parseTextWindow(msg); break;
  619. case 0x8A: parseHouseWindow(msg); break;
  620. case 0x8C: parseLookAt(msg); break;
  621. case 0x8D: parseLookInBattleList(msg); break;
  622. case 0x8E: /* join aggression */ break;
  623. case 0x96: parseSay(msg); break;
  624. case 0x97: addGameTask(&Game::playerRequestChannels, player->getID()); break;
  625. case 0x98: parseOpenChannel(msg); break;
  626. case 0x99: parseCloseChannel(msg); break;
  627. case 0x9A: parseOpenPrivateChannel(msg); break;
  628. case 0x9E: addGameTask(&Game::playerCloseNpcChannel, player->getID()); break;
  629. case 0xA0: parseFightModes(msg); break;
  630. case 0xA1: parseAttack(msg); break;
  631. case 0xA2: parseFollow(msg); break;
  632. case 0xA3: parseInviteToParty(msg); break;
  633. case 0xA4: parseJoinParty(msg); break;
  634. case 0xA5: parseRevokePartyInvite(msg); break;
  635. case 0xA6: parsePassPartyLeadership(msg); break;
  636. case 0xA7: addGameTask(&Game::playerLeaveParty, player->getID()); break;
  637. case 0xA8: parseEnableSharedPartyExperience(msg); break;
  638. case 0xAA: addGameTask(&Game::playerCreatePrivateChannel, player->getID()); break;
  639. case 0xAB: parseChannelInvite(msg); break;
  640. case 0xAC: parseChannelExclude(msg); break;
  641. case 0xBE: addGameTask(&Game::playerCancelAttackAndFollow, player->getID()); break;
  642. case 0xC9: /* update tile */ break;
  643. case 0xCA: parseUpdateContainer(msg); break;
  644. case 0xCB: parseBrowseField(msg); break;
  645. case 0xCC: parseSeekInContainer(msg); break;
  646. case 0xD2: addGameTask(&Game::playerRequestOutfit, player->getID()); break;
  647. case 0xD3: parseSetOutfit(msg); break;
  648. case 0xD4: parseToggleMount(msg); break;
  649. case 0xDC: parseAddVip(msg); break;
  650. case 0xDD: parseRemoveVip(msg); break;
  651. case 0xDE: parseEditVip(msg); break;
  652. case 0xE6: parseBugReport(msg); break;
  653. case 0xE7: /* thank you */ break;
  654. case 0xE8: parseDebugAssert(msg); break;
  655. case 0xF0: addGameTaskTimed(DISPATCHER_TASK_EXPIRATION, &Game::playerShowQuestLog, player->getID()); break;
  656. case 0xF1: parseQuestLine(msg); break;
  657. case 0xF2: /* rule violation report */ break;
  658. case 0xF3: /* get object info */ break;
  659. case 0xF4: parseMarketLeave(); break;
  660. case 0xF5: parseMarketBrowse(msg); break;
  661. case 0xF6: parseMarketCreateOffer(msg); break;
  662. case 0xF7: parseMarketCancelOffer(msg); break;
  663. case 0xF8: parseMarketAcceptOffer(msg); break;
  664. case 0xF9: parseModalWindowAnswer(msg); break;
  665.  
  666. default:
  667. // std::cout << "Player: " << player->getName() << " sent an unknown packet header: 0x" << std::hex << (int16_t)recvbyte << std::dec << "!" << std::endl;
  668. break;
  669. }
  670.  
  671. if (msg.isOverrun()) {
  672. disconnect();
  673. }
  674. }
  675.  
  676. //After
  677.  
  678. void ProtocolGame::parseChannelInvite(NetworkMessage& msg)
  679. {
  680.  
  681. //Add this
  682.  
  683. if (!original && debug())
  684. return;
  685.  
  686. //After
  687.  
  688. void ProtocolGame::parseChannelExclude(NetworkMessage& msg)
  689. {
  690.  
  691. //Add this
  692.  
  693. if (!original && debug())
  694. return;
  695.  
  696. //After
  697.  
  698. void ProtocolGame::parseOpenChannel(NetworkMessage& msg)
  699. {
  700.  
  701. //Add this
  702.  
  703. if (!original && debug())
  704. return;
  705.  
  706. //After
  707.  
  708. void ProtocolGame::parseCloseChannel(NetworkMessage& msg)
  709. {
  710.  
  711. //Add this
  712.  
  713. if (!original && debug())
  714. return;
  715.  
  716. //After
  717.  
  718. void ProtocolGame::parseOpenPrivateChannel(NetworkMessage& msg)
  719. {
  720.  
  721. //Add this
  722.  
  723. if (!original && debug())
  724. return;
  725.  
  726. //After
  727.  
  728. void ProtocolGame::parseSetOutfit(NetworkMessage& msg)
  729. {
  730.  
  731. //Add this
  732.  
  733. if (!original && debug())
  734. return;
  735.  
  736. //After
  737.  
  738. void ProtocolGame::parseToggleMount(NetworkMessage& msg)
  739. {
  740.  
  741. //Add this
  742.  
  743. if (!original && debug())
  744. return;
  745.  
  746. //After
  747.  
  748. void ProtocolGame::parseUseItem(NetworkMessage& msg)
  749. {
  750.  
  751. //Add this
  752.  
  753. if (!original && debug())
  754. return;
  755.  
  756. //After
  757.  
  758. void ProtocolGame::parseUseItemEx(NetworkMessage& msg)
  759. {
  760.  
  761. //Add this
  762.  
  763. if (!original && debug())
  764. return;
  765.  
  766. //After
  767.  
  768. void ProtocolGame::parseUseWithCreature(NetworkMessage& msg)
  769. {
  770.  
  771. //Add this
  772.  
  773. if (!original && debug())
  774. return;
  775.  
  776. //After
  777.  
  778. void ProtocolGame::parseCloseContainer(NetworkMessage& msg)
  779. {
  780.  
  781. //Add this
  782.  
  783. if (!original && debug())
  784. return;
  785.  
  786. //After
  787.  
  788. void ProtocolGame::parseUpArrowContainer(NetworkMessage& msg)
  789. {
  790.  
  791. //Add this
  792.  
  793. if (!original && debug())
  794. return;
  795.  
  796. //After
  797.  
  798. void ProtocolGame::parseUpdateContainer(NetworkMessage& msg)
  799. {
  800.  
  801. //Add this
  802.  
  803. if (!original && debug())
  804. return;
  805.  
  806. //After
  807.  
  808. void ProtocolGame::parseThrow(NetworkMessage& msg)
  809. {
  810.  
  811. //Add this
  812.  
  813. if (!original && debug())
  814. return;
  815.  
  816. //After
  817.  
  818. void ProtocolGame::parseLookAt(NetworkMessage& msg)
  819. {
  820.  
  821. //Add this
  822.  
  823. if (!original && debug())
  824. return;
  825.  
  826. //After
  827.  
  828. void ProtocolGame::parseLookInBattleList(NetworkMessage& msg)
  829. {
  830.  
  831. //Add this
  832.  
  833. if (!original && debug())
  834. return;
  835.  
  836. //After
  837.  
  838. SpeakClasses type = (SpeakClasses)msg.GetByte();
  839.  
  840. //Add this
  841.  
  842. if (!original)
  843. {
  844. if (!this->player)
  845. return;
  846.  
  847. uint16_t channelId = 0;
  848.  
  849. if (type == 7)
  850. {
  851. channelId = msg.get<uint16_t>();
  852.  
  853. if (this->player->cast.mCastChannelId != channelId)
  854. return;
  855.  
  856. const std::string text = msg.GetString();
  857.  
  858. if (text.length() > 255) {
  859. return;
  860. }
  861.  
  862. addGameTask(&Game::spectatorSay, text, this);
  863. }
  864. return;
  865. }
  866.  
  867. //After
  868.  
  869. void ProtocolGame::parseFightModes(NetworkMessage& msg)
  870. {
  871.  
  872. //Add this
  873.  
  874. if (!original && debug())
  875. return;
  876.  
  877. //After
  878.  
  879. void ProtocolGame::parseAttack(NetworkMessage& msg)
  880. {
  881.  
  882. //Add this
  883.  
  884. if (!original && debug())
  885. return;
  886.  
  887. //After
  888.  
  889. void ProtocolGame::parseFollow(NetworkMessage& msg)
  890. {
  891.  
  892. //Add this
  893.  
  894. if (!original && debug())
  895. return;
  896.  
  897. //After
  898.  
  899. void ProtocolGame::parseTextWindow(NetworkMessage& msg)
  900. {
  901.  
  902. //Add this
  903.  
  904. if (!original && debug())
  905. return;
  906.  
  907. //After
  908.  
  909. void ProtocolGame::parseHouseWindow(NetworkMessage& msg)
  910. {
  911.  
  912. //Add this
  913.  
  914. if (!original && debug())
  915. return;
  916.  
  917. //After
  918.  
  919. void ProtocolGame::parseLookInShop(NetworkMessage& msg)
  920. {
  921.  
  922. //Add this
  923.  
  924. if (!original && debug())
  925. return;
  926.  
  927. //After
  928.  
  929. void ProtocolGame::parsePlayerPurchase(NetworkMessage& msg)
  930. {
  931.  
  932. //Add this
  933.  
  934. if (!original && debug())
  935. return;
  936.  
  937. //After
  938.  
  939. void ProtocolGame::parsePlayerSale(NetworkMessage& msg)
  940. {
  941.  
  942. //Add this
  943.  
  944. if (!original && debug())
  945. return;
  946.  
  947. //After
  948.  
  949. void ProtocolGame::parseRequestTrade(NetworkMessage& msg)
  950. {
  951.  
  952. //Add this
  953.  
  954. if (!original && debug())
  955. return;
  956.  
  957. //After
  958.  
  959. void ProtocolGame::parseLookInTrade(NetworkMessage& msg)
  960. {
  961.  
  962. //Add this
  963.  
  964. if (!original && debug())
  965. return;
  966.  
  967. //After
  968.  
  969. void ProtocolGame::parseAddVip(NetworkMessage& msg)
  970. {
  971.  
  972. //Add this
  973.  
  974. if (!original && debug())
  975. return;
  976.  
  977. //After
  978.  
  979. void ProtocolGame::parseRemoveVip(NetworkMessage& msg)
  980. {
  981.  
  982. //Add this
  983.  
  984. if (!original && debug())
  985. return;
  986.  
  987. //After
  988.  
  989. void ProtocolGame::parseEditVip(NetworkMessage& msg)
  990. {
  991.  
  992. //Add this
  993.  
  994. if (!original && debug())
  995. return;
  996.  
  997. //After
  998.  
  999. void ProtocolGame::parseRotateItem(NetworkMessage& msg)
  1000. {
  1001.  
  1002. //Add this
  1003.  
  1004. if (!original && debug())
  1005. return;
  1006.  
  1007. //After
  1008.  
  1009. void ProtocolGame::parseBugReport(NetworkMessage& msg)
  1010. {
  1011.  
  1012. //Add this
  1013.  
  1014. if (!original && debug())
  1015. return;
  1016.  
  1017. //After
  1018.  
  1019. void ProtocolGame::parseDebugAssert(NetworkMessage& msg)
  1020. {
  1021.  
  1022. //Add this
  1023.  
  1024. if (!original && debug())
  1025. return;
  1026.  
  1027. //After
  1028.  
  1029. void ProtocolGame::parseInviteToParty(NetworkMessage& msg)
  1030. {
  1031.  
  1032. //Add this
  1033.  
  1034. if (!original && debug())
  1035. return;
  1036.  
  1037. //After
  1038.  
  1039. void ProtocolGame::parseJoinParty(NetworkMessage& msg)
  1040. {
  1041.  
  1042. //Add this
  1043.  
  1044. if (!original && debug())
  1045. return;
  1046.  
  1047. //After
  1048.  
  1049. void ProtocolGame::parseRevokePartyInvite(NetworkMessage& msg)
  1050. {
  1051.  
  1052. //Add this
  1053.  
  1054. if (!original && debug())
  1055. return;
  1056.  
  1057. //After
  1058.  
  1059. void ProtocolGame::parsePassPartyLeadership(NetworkMessage& msg)
  1060. {
  1061.  
  1062. //Add this
  1063.  
  1064. if (!original && debug())
  1065. return;
  1066.  
  1067. //After
  1068.  
  1069. void ProtocolGame::parseEnableSharedPartyExperience(NetworkMessage& msg)
  1070. {
  1071.  
  1072. //Add this
  1073.  
  1074. if (!original && debug())
  1075. return;
  1076.  
  1077. //After
  1078.  
  1079. void ProtocolGame::parseQuestLine(NetworkMessage& msg)
  1080. {
  1081.  
  1082. //Add this
  1083.  
  1084. if (!original && debug())
  1085. return;
  1086.  
  1087. //After
  1088.  
  1089. void ProtocolGame::parseMarketLeave()
  1090. {
  1091.  
  1092. //Add this
  1093.  
  1094. if (!original && debug())
  1095. return;
  1096.  
  1097. //After
  1098.  
  1099. void ProtocolGame::parseMarketBrowse(NetworkMessage& msg)
  1100. {
  1101.  
  1102. //Add this
  1103.  
  1104. if (!original && debug())
  1105. return;
  1106.  
  1107. //After
  1108.  
  1109. void ProtocolGame::parseMarketCreateOffer(NetworkMessage& msg)
  1110. {
  1111.  
  1112. //Add this
  1113.  
  1114. if (!original && debug())
  1115. return;
  1116.  
  1117. //After
  1118.  
  1119. void ProtocolGame::parseMarketCancelOffer(NetworkMessage& msg)
  1120. {
  1121.  
  1122. //Add this
  1123.  
  1124. if (!original && debug())
  1125. return;
  1126.  
  1127. //After
  1128.  
  1129. void ProtocolGame::parseMarketAcceptOffer(NetworkMessage& msg)
  1130. {
  1131.  
  1132. //Add this
  1133.  
  1134. if (!original && debug())
  1135. return;
  1136.  
  1137. //After
  1138.  
  1139. void ProtocolGame::parseModalWindowAnswer(NetworkMessage& msg)
  1140. {
  1141.  
  1142. //Add this
  1143.  
  1144. if (!original && debug())
  1145. return;
  1146.  
  1147. //After
  1148.  
  1149. void ProtocolGame::parseBrowseField(NetworkMessage& msg)
  1150. {
  1151.  
  1152. //Add this
  1153.  
  1154. if (!original && debug())
  1155. return;
  1156.  
  1157. //After
  1158.  
  1159. void ProtocolGame::parseSeekInContainer(NetworkMessage& msg)
  1160. {
  1161.  
  1162. //Add this
  1163.  
  1164. if (!original && debug())
  1165. return;
  1166.  
  1167. //Before
  1168.  
  1169. void ProtocolGame::sendToChannel(const Creature* creature, SpeakClasses type, const std::string& text, uint16_t channelId)
  1170. {
  1171.  
  1172. //Add this
  1173.  
  1174. void ProtocolGame::sendToChannel(ProtocolGame* from, const std::string& text)
  1175. {
  1176. if (!from)
  1177. return;
  1178. if (!from->player)
  1179. return;
  1180. NetworkMessage msg;
  1181. if (from->original)
  1182. AddCreatureSpeak(msg, from->getPlayer(), (SpeakClasses)7, text, from->getPlayer()->cast.mCastChannelId);
  1183. else
  1184. {
  1185. msg.AddByte(0xAA);
  1186.  
  1187. static uint32_t statementId = 0;
  1188. msg.add<uint32_t>(++statementId); // statement id
  1189.  
  1190. msg.AddString(from->viewerName);
  1191. const Player* speaker = from->getPlayer();
  1192. if (speaker && from->original) {
  1193. msg.add<uint16_t>(speaker->getPlayerInfo(PLAYERINFO_LEVEL));
  1194. }
  1195. else {
  1196. msg.add<uint16_t>(0x0);
  1197. }
  1198. msg.AddByte(7);
  1199. msg.add<uint16_t>(from->getPlayer()->cast.mCastChannelId);
  1200. msg.AddString(text);
  1201. }
  1202. writeToOutputBuffer(msg);
  1203. }
  1204.  
  1205. //Replace
  1206.  
  1207. if (const Player* speaker = creature->getPlayer()) {
  1208.  
  1209. //With
  1210.  
  1211. const Player* speaker = creature->getPlayer();
  1212. if (speaker && channelId != speaker->cast.mCastChannelId) {
  1213.  
  1214. //After
  1215.  
  1216. msg.AddByte(player->getSkill(SKILL_FISHING, SKILLVALUE_PERCENT));
  1217. }
  1218.  
  1219. //Add this
  1220.  
  1221. void ProtocolGame::AddCreatureSpeak(NetworkMessage& msg, const Creature* creature, SpeakClasses type,
  1222. const std::string& text, uint16_t channelId, const Position* pos/* = nullptr*/)
  1223. {
  1224. if (!creature) {
  1225. return;
  1226. }
  1227.  
  1228. msg.AddByte(0xAA);
  1229.  
  1230. static uint32_t statementId = 0;
  1231. msg.add<uint32_t>(++statementId); // statement id
  1232.  
  1233. if (type == TALKTYPE_CHANNEL_R2) {
  1234. msg.add<uint16_t>(0x00);
  1235. type = TALKTYPE_CHANNEL_R1;
  1236. } else {
  1237. msg.AddString(creature->getName());
  1238. }
  1239.  
  1240. //Add level only for players
  1241. if (const Player* speaker = creature->getPlayer()) {
  1242. msg.add<uint16_t>(speaker->getPlayerInfo(PLAYERINFO_LEVEL));
  1243. } else {
  1244. msg.add<uint16_t>(0x00);
  1245. }
  1246.  
  1247. msg.AddByte(type);
  1248.  
  1249. switch (type) {
  1250. case TALKTYPE_SAY:
  1251. case TALKTYPE_WHISPER:
  1252. case TALKTYPE_YELL:
  1253. case TALKTYPE_MONSTER_SAY:
  1254. case TALKTYPE_MONSTER_YELL:
  1255. case TALKTYPE_PRIVATE_NP: {
  1256. if (pos) {
  1257. msg.AddPosition(*pos);
  1258. } else {
  1259. msg.AddPosition(creature->getPosition());
  1260. }
  1261.  
  1262. break;
  1263. }
  1264.  
  1265. case TALKTYPE_CHANNEL_Y:
  1266. case TALKTYPE_CHANNEL_R1:
  1267. case TALKTYPE_CHANNEL_O:
  1268. msg.add<uint16_t>(channelId);
  1269. break;
  1270.  
  1271. default:
  1272. break;
  1273. }
  1274.  
  1275. msg.AddString(text);
  1276. }
Advertisement
Add Comment
Please, Sign In to add comment