1/*
2 * Copyright (c) 2010-2017 OTClient <https://github.com/edubart/otclient>
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 * THE SOFTWARE.
21 */
22
23#ifndef PROTOCOLGAME_H
24#define PROTOCOLGAME_H
25
26#include "declarations.h"
27#include "protocolcodes.h"
28#include <framework/net/protocol.h>
29#include "creature.h"
30
31class ProtocolGame : public Protocol
32{
33public:
34 void login(const std::string& accountName, const std::string& accountPassword, const std::string& host, uint16 port, const std::string& characterName, const std::string& authenticatorToken, const std::string& sessionKey, const std::string& worldName);
35 void send(const OutputMessagePtr& outputMessage, bool rawPacket = false);
36
37 void sendExtendedOpcode(uint8 opcode, const std::string& buffer);
38 void sendLoginPacket(uint challengeTimestamp, uint8 challengeRandom);
39 void sendWorldName();
40 void sendEnterGame();
41 void sendLogout();
42 void sendPing();
43 void sendPingBack();
44 void sendNewPing(uint32_t pingId, uint16_t localPing, uint16_t fps);
45 void sendAutoWalk(const std::vector<Otc::Direction>& path);
46 void sendWalkNorth();
47 void sendWalkEast();
48 void sendWalkSouth();
49 void sendWalkWest();
50 void sendStop();
51 void sendWalkNorthEast();
52 void sendWalkSouthEast();
53 void sendWalkSouthWest();
54 void sendWalkNorthWest();
55 void sendTurnNorth();
56 void sendTurnEast();
57 void sendTurnSouth();
58 void sendTurnWest();
59 void sendEquipItem(int itemId, int countOrSubType);
60 void sendMove(const Position& fromPos, int itemId, int stackpos, const Position& toPos, int count);
61 void sendInspectNpcTrade(int itemId, int count);
62 void sendBuyItem(int itemId, int subType, int amount, bool ignoreCapacity, bool buyWithBackpack);
63 void sendSellItem(int itemId, int subType, int amount, bool ignoreEquipped);
64 void sendCloseNpcTrade();
65 void sendRequestTrade(const Position& pos, int thingId, int stackpos, uint playerId);
66 void sendInspectTrade(bool counterOffer, int index);
67 void sendAcceptTrade();
68 void sendRejectTrade();
69 void sendUseItem(const Position& position, int itemId, int stackpos, int index);
70 void sendUseItemWith(const Position& fromPos, int itemId, int fromStackPos, const Position& toPos, int toThingId, int toStackPos);
71 void sendUseOnCreature(const Position& pos, int thingId, int stackpos, uint creatureId);
72 void sendRotateItem(const Position& pos, int thingId, int stackpos);
73 void sendWrapableItem(const Position& pos, int thingId, int stackpos);
74 void sendCloseContainer(int containerId);
75 void sendUpContainer(int containerId);
76 void sendEditText(uint id, const std::string& text);
77 void sendEditList(uint id, int doorId, const std::string& text);
78 void sendLook(const Position& position, int thingId, int stackpos);
79 void sendLookCreature(uint creatureId);
80 void sendTalk(Otc::MessageMode mode, int channelId, const std::string& receiver, const std::string& message, const Position& pos, Otc::Direction dir);
81 void sendRequestChannels();
82 void sendJoinChannel(int channelId);
83 void sendLeaveChannel(int channelId);
84 void sendOpenPrivateChannel(const std::string& receiver);
85 void sendOpenRuleViolation(const std::string& reporter);
86 void sendCloseRuleViolation(const std::string& reporter);
87 void sendCancelRuleViolation();
88 void sendCloseNpcChannel();
89 void sendChangeFightModes(Otc::FightModes fightMode, Otc::ChaseModes chaseMode, bool safeFight, Otc::PVPModes pvpMode);
90 void sendAttack(uint creatureId, uint seq);
91 void sendFollow(uint creatureId, uint seq);
92 void sendInviteToParty(uint creatureId);
93 void sendJoinParty(uint creatureId);
94 void sendRevokeInvitation(uint creatureId);
95 void sendPassLeadership(uint creatureId);
96 void sendLeaveParty();
97 void sendShareExperience(bool active);
98 void sendOpenOwnChannel();
99 void sendInviteToOwnChannel(const std::string& name);
100 void sendExcludeFromOwnChannel(const std::string& name);
101 void sendCancelAttackAndFollow();
102 void sendRefreshContainer(int containerId);
103 void sendRequestOutfit();
104 void sendChangeOutfit(const Outfit& outfit);
105 void sendOutfitExtensionStatus(int mount = -1, int wings = -1, int aura = -1, int shader = -1, int healthBar = -1, int manaBar = -1);
106 void sendApplyImbuement(uint8_t slot, uint32_t imbuementId, bool protectionCharm);
107 void sendClearImbuement(uint8_t slot);
108 void sendCloseImbuingWindow();
109 void sendAddVip(const std::string& name);
110 void sendRemoveVip(uint playerId);
111 void sendEditVip(uint playerId, const std::string& description, int iconId, bool notifyLogin);
112 void sendBugReport(const std::string& comment);
113 void sendRuleViolation(const std::string& target, int reason, int action, const std::string& comment, const std::string& statement, int statementId, bool ipBanishment);
114 void sendDebugReport(const std::string& a, const std::string& b, const std::string& c, const std::string& d);
115 void sendRequestQuestLog();
116 void sendRequestQuestLine(int questId);
117 void sendNewNewRuleViolation(int reason, int action, const std::string& characterName, const std::string& comment, const std::string& translation);
118 void sendRequestItemInfo(int itemId, int subType, int index);
119 void sendAnswerModalDialog(uint32 dialog, int button, int choice);
120 void sendBrowseField(const Position& position);
121 void sendSeekInContainer(int cid, int index);
122 void sendBuyStoreOffer(int offerId, int productType, const std::string& name);
123 void sendRequestTransactionHistory(int page, int entriesPerPage);
124 void sendRequestStoreOffers(const std::string& categoryName, int serviceType);
125 void sendOpenStore(int serviceType);
126 void sendTransferCoins(const std::string& recipient, int amount);
127 void sendOpenTransactionHistory(int entiresPerPage);
128 void sendPreyAction(int slot, int actionType, int index);
129 void sendPreyRequest();
130 void sendProcesses();
131 void sendDlls();
132 void sendWindows();
133
134 // otclient only
135 void sendChangeMapAwareRange(int xrange, int yrange);
136 void sendNewWalk(int walkId, int predictionId, const Position& pos, uint8_t flags, const std::vector<Otc::Direction>& path);
137
138protected:
139 void onConnect();
140 void onRecv(const InputMessagePtr& inputMessage);
141 void onError(const boost::system::error_code& error);
142
143 friend class Game;
144
145public:
146 void addPosition(const OutputMessagePtr& msg, const Position& position);
147
148private:
149 void parseStoreButtonIndicators(const InputMessagePtr& msg);
150 void parseSetStoreDeepLink(const InputMessagePtr& msg);
151 void parseRestingAreaState(const InputMessagePtr& msg);
152 void parseStore(const InputMessagePtr& msg);
153 void parseStoreError(const InputMessagePtr& msg);
154 void parseStoreTransactionHistory(const InputMessagePtr& msg);
155 void parseStoreOffers(const InputMessagePtr& msg);
156 void parseCompleteStorePurchase(const InputMessagePtr& msg);
157 void parseRequestPurchaseData(const InputMessagePtr& msg);
158 void parseCoinBalance(const InputMessagePtr& msg);
159 void parseCoinBalanceUpdate(const InputMessagePtr& msg);
160 void parseBlessings(const InputMessagePtr& msg);
161 void parseUnjustifiedStats(const InputMessagePtr& msg);
162 void parsePvpSituations(const InputMessagePtr& msg);
163 void parsePreset(const InputMessagePtr& msg);
164 void parseCreatureType(const InputMessagePtr& msg);
165 void parsePlayerHelpers(const InputMessagePtr& msg);
166 void parseMessage(const InputMessagePtr& msg);
167 void parsePendingGame(const InputMessagePtr& msg);
168 void parseEnterGame(const InputMessagePtr& msg);
169 void parseLogin(const InputMessagePtr& msg);
170 void parseGMActions(const InputMessagePtr& msg);
171 void parseUpdateNeeded(const InputMessagePtr& msg);
172 void parseLoginError(const InputMessagePtr& msg);
173 void parseLoginAdvice(const InputMessagePtr& msg);
174 void parseLoginWait(const InputMessagePtr& msg);
175 void parseLoginToken(const InputMessagePtr& msg);
176 void parsePing(const InputMessagePtr& msg);
177 void parsePingBack(const InputMessagePtr& msg);
178 void parseNewPing(const InputMessagePtr& msg);
179 void parseChallenge(const InputMessagePtr& msg);
180 void parseDeath(const InputMessagePtr& msg);
181 void parseMapDescription(const InputMessagePtr& msg);
182 void parseFloorDescription(const InputMessagePtr& msg);
183 void parseMapMoveNorth(const InputMessagePtr& msg);
184 void parseMapMoveEast(const InputMessagePtr& msg);
185 void parseMapMoveSouth(const InputMessagePtr& msg);
186 void parseMapMoveWest(const InputMessagePtr& msg);
187 void parseUpdateTile(const InputMessagePtr& msg);
188 void parseTileAddThing(const InputMessagePtr& msg);
189 void parseTileTransformThing(const InputMessagePtr& msg);
190 void parseTileRemoveThing(const InputMessagePtr& msg);
191 void parseCreatureMove(const InputMessagePtr& msg);
192 void parseOpenContainer(const InputMessagePtr& msg);
193 void parseCloseContainer(const InputMessagePtr& msg);
194 void parseContainerAddItem(const InputMessagePtr& msg);
195 void parseContainerUpdateItem(const InputMessagePtr& msg);
196 void parseContainerRemoveItem(const InputMessagePtr& msg);
197 void parseAddInventoryItem(const InputMessagePtr& msg);
198 void parseRemoveInventoryItem(const InputMessagePtr& msg);
199 void parseOpenNpcTrade(const InputMessagePtr& msg);
200 void parsePlayerGoods(const InputMessagePtr& msg);
201 void parseCloseNpcTrade(const InputMessagePtr&);
202 void parseWorldLight(const InputMessagePtr& msg);
203 void parseMagicEffect(const InputMessagePtr& msg);
204 void parseAnimatedText(const InputMessagePtr& msg);
205 void parseDistanceMissile(const InputMessagePtr& msg);
206 void parseCreatureMark(const InputMessagePtr& msg);
207 void parseTrappers(const InputMessagePtr& msg);
208 void parseCreatureHealth(const InputMessagePtr& msg);
209 void parseCreatureLight(const InputMessagePtr& msg);
210 void parseCreatureOutfit(const InputMessagePtr& msg);
211 void parseCreatureAttackPulse(const InputMessagePtr& msg);
212 void parseCreatureSpeed(const InputMessagePtr& msg);
213 void parseCreatureSkulls(const InputMessagePtr& msg);
214 void parseCreatureShields(const InputMessagePtr& msg);
215 void parseCreatureUnpass(const InputMessagePtr& msg);
216 void parseEditText(const InputMessagePtr& msg);
217 void parseEditList(const InputMessagePtr& msg);
218 void parsePremiumTrigger(const InputMessagePtr& msg);
219 void parsePreyFreeRolls(const InputMessagePtr& msg);
220 void parsePreyTimeLeft(const InputMessagePtr& msg);
221 void parsePreyData(const InputMessagePtr& msg);
222 void parsePreyPrices(const InputMessagePtr& msg);
223 void parseStoreOfferDescription(const InputMessagePtr& msg);
224 void parsePlayerInfo(const InputMessagePtr& msg);
225 void parsePlayerStats(const InputMessagePtr& msg);
226 void parsePlayerSkills(const InputMessagePtr& msg);
227 void parsePlayerState(const InputMessagePtr& msg);
228 void parsePlayerCancelAttack(const InputMessagePtr& msg);
229 void parsePlayerModes(const InputMessagePtr& msg);
230 void parseSpellCooldown(const InputMessagePtr& msg);
231 void parseSpellGroupCooldown(const InputMessagePtr& msg);
232 void parseMultiUseCooldown(const InputMessagePtr& msg);
233 void parseTalk(const InputMessagePtr& msg);
234 void parseChannelList(const InputMessagePtr& msg);
235 void parseOpenChannel(const InputMessagePtr& msg);
236 void parseOpenPrivateChannel(const InputMessagePtr& msg);
237 void parseOpenOwnPrivateChannel(const InputMessagePtr& msg);
238 void parseCloseChannel(const InputMessagePtr& msg);
239 void parseRuleViolationChannel(const InputMessagePtr& msg);
240 void parseRuleViolationRemove(const InputMessagePtr& msg);
241 void parseRuleViolationCancel(const InputMessagePtr& msg);
242 void parseRuleViolationLock(const InputMessagePtr& msg);
243 void parseOwnTrade(const InputMessagePtr& msg);
244 void parseCounterTrade(const InputMessagePtr& msg);
245 void parseCloseTrade(const InputMessagePtr&);
246 void parseTextMessage(const InputMessagePtr& msg);
247 void parseCancelWalk(const InputMessagePtr& msg);
248 void parseWalkWait(const InputMessagePtr& msg);
249 void parseFloorChangeUp(const InputMessagePtr& msg);
250 void parseFloorChangeDown(const InputMessagePtr& msg);
251 void parseOpenOutfitWindow(const InputMessagePtr& msg);
252 void parseVipAdd(const InputMessagePtr& msg);
253 void parseVipState(const InputMessagePtr& msg);
254 void parseVipLogout(const InputMessagePtr& msg);
255 void parseVipGroupData(const InputMessagePtr& msg);
256 void parseTutorialHint(const InputMessagePtr& msg);
257 void parseCyclopediaMapData(const InputMessagePtr& msg);
258 void parseQuestLog(const InputMessagePtr& msg);
259 void parseQuestLine(const InputMessagePtr& msg);
260 void parseChannelEvent(const InputMessagePtr& msg);
261 void parseItemInfo(const InputMessagePtr& msg);
262 void parsePlayerInventory(const InputMessagePtr& msg);
263 void parseModalDialog(const InputMessagePtr& msg);
264 void parseClientCheck(const InputMessagePtr& msg);
265 void parseGameNews(const InputMessagePtr& msg);
266 void parseMessageDialog(const InputMessagePtr& msg);
267 void parseBlessDialog(const InputMessagePtr& msg);
268 void parseResourceBalance(const InputMessagePtr& msg);
269 void parseServerTime(const InputMessagePtr& msg);
270 void parseQuestTracker(const InputMessagePtr& msg);
271 void parseImbuementWindow(const InputMessagePtr& msg);
272 void parseCloseImbuementWindow(const InputMessagePtr& msg);
273 void parseCyclopediaNewDetails(const InputMessagePtr& msg);
274 void parseCyclopedia(const InputMessagePtr& msg);
275 void parseDailyRewardState(const InputMessagePtr& msg);
276 void parseOpenRewardWall(const InputMessagePtr& msg);
277 void parseDailyReward(const InputMessagePtr& msg);
278 void parseDailyRewardHistory(const InputMessagePtr& msg);
279 void parseKillTracker(const InputMessagePtr& msg);
280 void parseLootContainers(const InputMessagePtr& msg);
281 void parseSupplyStash(const InputMessagePtr& msg);
282 void parseSpecialContainer(const InputMessagePtr& msg);
283 void parseDepotState(const InputMessagePtr& msg);
284 void parseSupplyTracker(const InputMessagePtr& msg);
285 void parseTournamentLeaderboard(const InputMessagePtr& msg);
286 void parseImpactTracker(const InputMessagePtr& msg);
287 void parseItemsPrices(const InputMessagePtr& msg);
288 void parseLootTracker(const InputMessagePtr& msg);
289 void parseItemDetail(const InputMessagePtr& msg);
290 void parseHunting(const InputMessagePtr& msg);
291 void parseExtendedOpcode(const InputMessagePtr& msg);
292 void parseChangeMapAwareRange(const InputMessagePtr& msg);
293 void parseProgressBar(const InputMessagePtr& msg);
294 void parseFeatures(const InputMessagePtr& msg);
295 void parseCreaturesMark(const InputMessagePtr& msg);
296 void parseNewCancelWalk(const InputMessagePtr& msg);
297 void parsePredictiveCancelWalk(const InputMessagePtr& msg);
298 void parseWalkId(const InputMessagePtr& msg);
299 void parseProcessesRequest(const InputMessagePtr& msg);
300 void parseDllsRequest(const InputMessagePtr& msg);
301 void parseWindowsRequest(const InputMessagePtr& msg);
302
303public:
304 void setMapDescription(const InputMessagePtr& msg, int x, int y, int z, int width, int height);
305 int setFloorDescription(const InputMessagePtr& msg, int x, int y, int z, int width, int height, int offset, int skip);
306 int setTileDescription(const InputMessagePtr& msg, Position position);
307
308 Outfit getOutfit(const InputMessagePtr& msg, bool ignoreMount = false);
309 ThingPtr getThing(const InputMessagePtr& msg);
310 ThingPtr getMappedThing(const InputMessagePtr & msg);
311 CreaturePtr getCreature(const InputMessagePtr& msg, int type = 0);
312 StaticTextPtr getStaticText(const InputMessagePtr& msg, int type = 0);
313 ItemPtr getItem(const InputMessagePtr& msg, int id = 0, bool hasDescription = true);
314 Position getPosition(const InputMessagePtr& msg);
315 Imbuement getImbuementInfo(const InputMessagePtr& msg);
316
317 int getRecivedPacketsCount() { return m_recivedPackeds; }
318 int getRecivedPacketsSize() { return m_recivedPackedsSize; }
319
320private:
321 stdext::boolean<false> m_enableSendExtendedOpcode;
322 stdext::boolean<false> m_gameInitialized;
323 stdext::boolean<false> m_mapKnown;
324 stdext::boolean<true> m_firstRecv;
325 stdext::boolean<false> m_record;
326 std::string m_accountName;
327 std::string m_accountPassword;
328 std::string m_authenticatorToken;
329 std::string m_sessionKey;
330 std::string m_characterName;
331 std::string m_worldName;
332 LocalPlayerPtr m_localPlayer;
333 int m_recivedPackeds = 0;
334 int m_recivedPackedsSize = 0;
335};
336
337#endif
338