summaryrefslogtreecommitdiff
path: root/servergreps/hercules/src/packetdb.py
blob: 40b6dc3f9459f8f6078c6128d86db96f0a81e4b0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
#! /usr/bin/env python2
# -*- coding: utf8 -*-
#
# Copyright (C) 2015-2016  Evol Online
# Author: Andrei Karas (4144)

import re

class PacketDb:
    packetVersionRe = re.compile("^//(?P<v1>[\d][\d][\d][\d])-(?P<v2>[\d][\d])-(?P<v3>[\d][\d])")
    clientpacketre = re.compile(
        "^0x(?P<packet>[0-9a-fA-F]+),(?P<len>[\w-]+)" +
        ",(?P<function>[0-9a-zA-Z_]+),")
    serverpacketre = re.compile(
        "^0x(?P<packet>[0-9a-fA-F]+),(?P<len>[\w-]+)")

    nameMap = {
#3CeAm
        'guildinvite': 'clif->pGuildInvite',
        'createparty': 'clif->pCreateParty',
        'ticksend': 'clif->pTickSend',
        'viewplayerequip': 'clif->pViewPlayerEquip',
        'hommovetomaster': 'clif->pHomMoveToMaster',
        'wisexin': 'clif->pPMIgnore',
        'storagepassword': 'clif->pStoragePassword',
        'npccloseclicked': 'clif->pNpcCloseClicked',
        'guildrequestinfo': 'clif->pGuildRequestInfo',
        'hommenu': 'clif->pHomMenu',
        'createchatroom': 'clif->pCreateChatRoom',
        'partychangeleader': 'clif->pPartyChangeLeader',
        'tradecancel': 'clif->pTradeCancel',
        'wanttoconnection': 'clif->pWantToConnection',
        'lesseffect': 'clif->pLessEffect',
        'gmhide': 'clif->pGMHide',
        'purchasereq2': 'clif->pPurchaseReq2',
        'stopattack': 'clif->pStopAttack',
        'walktoxy': 'clif->pWalkToXY',
        'npcclicked': 'clif->pNpcClicked',
        'bookingcanceljoinparty': 'clif->pDull',
        'recall2': 'clif->pGMRecall2',
        'changedir': 'clif->pChangeDir',
        'guildleave': 'clif->pGuildLeave',
        'searchstoreinfo': 'clif->pSearchStoreInfo',
        'bookingsearchreq': 'clif->pPartyBookingSearchReq',
        'partyinvite': 'clif->pPartyInvite',
        'auctionclose': 'clif->pAuction_close',
        'repairitem': 'clif->pRepairItem',
        'bookingignorereq': 'clif->pDull',
        'searchstoreinfonextpage': 'clif->pSearchStoreInfoNextPage',
        'solvecharname': 'clif->pSolveCharName',
        'guildreplyalliance': 'clif->pGuildReplyAlliance',
        'weaponrefine': 'clif->pWeaponRefine',
        'maildelete': 'clif->pMail_delete',
        'useskilltoid': 'clif->pUseSkillToId',
        'cashshopbuy': 'clif->pCashShopBuy',
        'traderequest': 'clif->pTradeRequest',
        'restart': 'clif->pRestart',
        'gmreqnochat': 'clif->pGMReqNoChat',
        'movefromkafra': 'clif->pMoveFromKafra',
        'replypartyinvite2': 'clif->pReplyPartyInvite2',
        'changechatowner': 'clif->pChangeChatOwner',
        'guildbreak': 'clif->pGuildBreak',
        'producemix': 'clif->pProduceMix',
        'auctionregister': 'clif->pAuction_register',
        'auctioncancel': 'clif->pAuction_cancel',
        'remove': 'clif->pGMShift',     # probably error
        'summon': 'clif->pGMRecall',    # probably error
        'openvending': 'clif->pOpenVending',
        'leaveparty': 'clif->pLeaveParty',
        'cashshopclose': 'clif->pCashShopClose',
        'guildchangenotice': 'clif->pGuildChangeNotice',
        'chatroomstatuschange': 'clif->pChatRoomStatusChange',
        'auctionsearch': 'clif->pAuction_search',
        'tradeack': 'clif->pTradeAck',
        'useitem': 'clif->pUseItem',
        'sndoridori': 'clif->pNoviceDoriDori',
        'guildreplyinvite': 'clif->pGuildReplyInvite',
        'selectarrow': 'clif->pSelectArrow',
        'feelsaveok': 'clif->pFeelSaveOk',
        'taekwon': 'clif->pTaekwon',
        'battlechat': 'clif->pBattleChat',
        'guilddelalliance': 'clif->pGuildDelAlliance',
        'cashshopreqtab': 'clif->pCashShopReqTab',
        'partyinvite2': 'clif->pPartyInvite2',
        'hommoveto': 'clif->pHomMoveTo',
        'useskilltoposmoreinfo': 'clif->pUseSkillToPosMoreInfo',
        'getcharnamerequest': 'clif->pGetCharNameRequest',
        'closesearchstoreinfo': 'clif->pCloseSearchStoreInfo',
        'localbroadcast': 'clif->pLocalBroadcast',
        'closekafra': 'clif->pCloseKafra',
        'putitemtocart': 'clif->pPutItemToCart',
        'actionrequest': 'clif->pActionRequest',
        'cashshopschedule': 'clif->pCashShopSchedule',
        'auctioncancelreg': 'clif->pAuction_cancelreg',
        'rc': 'clif->pGMRc',
        'guildexpulsion': 'clif->pGuildExpulsion',
        'partymessage': 'clif->pPartyMessage',
        'equiptickbox': 'clif->pEquipTick',
        'guildchangememberposition': 'clif->pGuildChangeMemberPosition',
        'adoptreply': 'clif->pAdopt_reply',
        'mailwinopen': 'clif->pMail_winopen',
        'hotkey': 'clif->pHotkey',
        'searchstoreinfolistitemclick': 'clif->pSearchStoreInfoListItemClick',
        'npcselllistsend': 'clif->pNpcSellListSend',
        'dropitem': 'clif->pDropItem',
        'takeitem': 'clif->pTakeItem',
        'npcselectmenu': 'clif->pNpcSelectMenu',
        'changehomunculusname': 'clif->pChangeHomunculusName',
        'shift': 'clif->pGMShift',
        'friendslistadd': 'clif->pFriendsListAdd',
        'sendemotion': 'clif->pSendEmotion',
        'progressbar': 'clif->pProgressbar',
        'bookingdelreq': 'clif->pPartyBookingDeleteReq',
        'howmanyconnections': 'clif->pHowManyConnections',
        'changemaptype': 'clif->pGMChangeMapType',
        'blacksmith': 'clif->pBlacksmith',
        'npcbuylistsend': 'clif->pNpcBuyListSend',
        'gmreqaccname': 'clif->pGMReqAccountName',
        'emotion': 'clif->pEmotion',
        'skillselectmenu': 'clif->pSkillSelectMenu',
        'reqtradebuyingstore': 'clif->pReqTradeBuyingStore',
        'pvpinfo': 'clif->pPVPInfo',
        'wisexlist': 'clif->pPMIgnoreList',
        'chataddmember': 'clif->pChatAddMember',
        'remove2': 'clif->pGMRemove2',
        'requestmemo': 'clif->pRequestMemo',
        'wis': 'clif->pWisMessage',
        'petmenu': 'clif->pPetMenu',
        'rankingpk': 'clif->pRankingPk',
        'mailgetattach': 'clif->pMail_getattach',
        'tradeadditem': 'clif->pTradeAddItem',
        'useskillmap': 'clif->pUseSkillMap',
        'auctionbuysell': 'clif->pAuction_buysell',
        'autorevive': 'clif->pAutoRevive',
        'movetokafrafromcart': 'clif->pMoveToKafraFromCart',
        'cashshopopen': 'clif->pCashShopOpen',
        'queststate': 'clif->pquestStateAck',
        'loadendack': 'clif->pLoadEndAck',
        'unequipitem': 'clif->pUnequipItem',
        'replypartyinvite': 'clif->pReplyPartyInvite',
        'guildrequestemblem': 'clif->pGuildRequestEmblem',
        'globalmessage': 'clif->pGlobalMessage',
        'reqclickbuyingstore': 'clif->pReqClickBuyingStore',
        'bookingsummonmember': 'clif->pDull',
        'friendslistreply': 'clif->pFriendsListReply',
        'npcstringinput': 'clif->pNpcStringInput',
        'closevending': 'clif->pCloseVending',
        'skillup': 'clif->pSkillUp',
        'broadcast': 'clif->pBroadcast',
        'guildcheckmaster': 'clif->pGuildCheckMaster',
        'guildchangeemblem': 'clif->pGuildChangeEmblem',
        'itemmonster': 'clif->pGM_Monster_Item',
        'vendinglistreq': 'clif->pVendingListReq',
        'guildrequestalliance': 'clif->pGuildRequestAlliance',
        'bookingupdatereq': 'clif->pPartyBookingUpdateReq',
        'removeoption': 'clif->pRemoveOption',
        'recall': 'clif->pGMRecall',
        'changepetname': 'clif->pChangePetName',
        'chatleave': 'clif->pChatLeave',
        'snexplosionspirits': 'clif->pNoviceExplosionSpirits',
        'mailread': 'clif->pMail_read',
        'mermenu': 'clif->pmercenary_action',
        'alchemist': 'clif->pAlchemist',
        'partychangeoption': 'clif->pPartyChangeOption',
        'tradeok': 'clif->pTradeOk',
        'kickfromchat': 'clif->pKickFromChat',
        'reqopenbuyingstore': 'clif->pReqOpenBuyingStore',
        'moveitem': 'clif->pMoveItem',
        'homattack': 'clif->pHomAttack',
        'ranking': 'clif->pRankingPk',
        'changecart': 'clif->pChangeCart',
        'reqclosebuyingstore': 'clif->pReqCloseBuyingStore',
        'removepartymember': 'clif->pRemovePartyMember',
        'catchpet': 'clif->pCatchPet',
        'selectegg': 'clif->pSelectEgg',
        'partybookingregisterreq': 'clif->pPartyBookingRegisterReq',
        'mailsend': 'clif->pMail_send',
        'itemlistwindowselected': 'clif->pItemListWindowSelected',
        'mailrefresh': 'clif->pMail_refreshinbox',
        'mapmove': 'clif->pMapMove',
        'check': 'clif->pCheck',
        'useskilltoposinfo': 'clif->pUseSkillToPosMoreInfo',
        'adoptrequest': 'clif->pAdopt_request',
        'npcamountinput': 'clif->pNpcAmountInput',
        'battlegroundreg': 'clif->pBGQueueRegister',
        'wisall': 'clif->pPMIgnoreAll',
        'npcnextclicked': 'clif->pNpcNextClicked',
        'resetchar': 'clif->pResetChar',
        'npcbuysellselected': 'clif->pNpcBuySellSelected',
        'killall': 'clif->pGMKickAll',
        'mailsetattach': 'clif->pMail_setattach',
        'insertcard': 'clif->pInsertCard',
        'purchasereq': 'clif->pPurchaseReq',
        'auctionbid': 'clif->pAuction_bid',
        'gmkick': 'clif->pGMKick',
        'auctionsetitem': 'clif->pAuction_setitem',
        'createparty2': 'clif->pCreateParty2',
        'statusup': 'clif->pStatusUp',
        'usecard': 'clif->pUseCard',
        'guildmessage': 'clif->pGuildMessage',
        'itemidentify': 'clif->pItemIdentify',
        'bookingjoinpartyreq': 'clif->pDull',
        'equipitem': 'clif->pEquipItem',
        'useskilltopos': 'clif->pUseSkillToPos',
        'autospell': 'clif->pAutoSpell',
        'cooking': 'clif->pCooking',
        'bookingregreq': 'clif->pPartyBookingRegisterReq',
        'movefromkafratocart': 'clif->pMoveFromKafraToCart',
        'mailreturn': 'clif->pMail_return',
        'tradecommit': 'clif->pTradeCommit',
        'quitgame': 'clif->pQuitGame',
        'movetokafra': 'clif->pMoveToKafra',
        'friendslistremove': 'clif->pFriendsListRemove',
        'getitemfromcart': 'clif->pGetItemFromCart',
        'guildopposition': 'clif->pGuildOpposition',
        'createguild': 'clif->pCreateGuild',
        'guildchangepositioninfo': 'clif->pGuildChangePositionInfo',
        'selectcart': 'clif->pSelectCart',

#rathena
        'partytick': 'clif->pPartyTick',
        'clientversion': 'in packet',
        'gmfullstrip': 'clif->pGMFullStrip',
        'guildinvite2': 'clif->pGuildInvite2',
        'mergeitem_req': 'clif->ackmergeitems',
        'mergeitem_cancel': 'clif->cancelmergeitem',
        'booking_playcancel': 'in packet',
        'cashshopitemlist': 'clif->pCashShopSchedule',
        'reqworldinfo': 'missing',
        'ranklist': 'clif->pRanklist',
        'bankdeposit': 'clif->pBankDeposit',
        'bankwithdrawal': 'clif->pBankWithdraw',
        'bankcheck': 'clif->pBankCheck',
        'bankopen': 'clif->pBankOpen',
        'bankclose': 'clif->pBankClose',
        'dull': 'clif->dull',
        'npcshopclosed': 'clif->pNPCShopClosed',
        'npcmarketpurchase': 'clif->pNPCMarketPurchase',
        'npcmarketclosed': 'clif->pNPCMarketClosed',
        'hotkeyrowshift': 'clif->pHotkeyRowShift',
        'rouletteopen': 'clif->pRouletteOpen',
        'rouletteinfo': 'clif->pRouletteInfo',
        'rouletteclose': 'clif->pRouletteClose',
        'roulettegenerate': 'clif->pRouletteGenerate',
        'rouletterecvitem': 'clif->pRouletteRecvItem'
    }

    @staticmethod
    def getInPackets(dbName, packetVersion, server):
        with open(dbName, "r") as f:
            version = "00000000"
            for line in f:
                m = PacketDb.packetVersionRe.search(line)
                if m is not None:
                    version = m.group("v1") + m.group("v2") + m.group("v3")
                if version > packetVersion:
                    continue
                m = PacketDb.clientpacketre.search(line)
                if m is not None:
                    data = m.group("packet").lower()
                    while len(data) < 4:
                        data = "0" + data
                    func = m.group("function")
                    if func not in PacketDb.nameMap:
                        if func.find("_") < 0:
                            print "Cant find name for functions " + func
                    else:
                        func = PacketDb.nameMap[func]
                    if func.find("_") < 0 and func != "in packet":
                        server.functionToId[func] = data
                        server.inPackets[data] = \
                            (int(m.group("len")), func)
                    #print "{0}, {1}, {2}".format(m.group("packet"), m.group("len"), func)
                m = PacketDb.serverpacketre.search(line)
                if m is not None:
                    data = m.group("packet").lower()
                    while len(data) < 4:
                        data = "0" + data
                    server.knownLenPackets[data] = int(m.group("len"))