|
|
转载
1 ]) b0 @* ~+ W自动合成的逻辑过于复杂就不给出了主要就是利用以下汇编点:6 c2 T* L2 K9 i$ w, `9 M0 z& o% d9 A
D2Client:
* }2 B2 t3 ^/ H; Z( s. t! r) _6FB20AE1为拦截输入框(用于获得命令), T O+ u) ~7 u" c
6FB5E11C为客户端获得0x9C 0x04数据包位置 也就是进入储存的触发
: F8 s7 S9 _! P3 x) H; L& Q9 e6FB5E8D0为客户端获得0x9D 0x05数据包的位置 也是从储存中提起的触发
+ O0 U+ [ a7 O6FAF4230为hackmap的loop点 我用的hackmap导出位置
' C8 R/ h4 }1 h2 S) x& |/ l; M/ J
; O5 D' t" }2 x& B; e; E! g) h/ G% A U& B
发包函数:
7 @* }) p0 w$ Aclass D2PKT_ITEM
* x" j+ n7 ]9 u. Z& g1 N{& d; p% G0 A5 s& g4 x; t
#define ITEM_ACTION_NEW_GROUND 0x00 //9c//新产生在地上 地上/ D. p0 P. ^9 C/ C+ }0 O& c" m
#define ITEM_ACTION_PICK_UP 0x01 //9c//拾取 多$ e( p& C+ S S5 u j
#define ITEM_ACTION_DROP 0x02 //9c//丢弃 地上
% J% p* ]. z7 ]* ?- D! M#define ITEM_ACTION_OLD_GROUND 0x03 //9c//旧的地上 地上( ~4 i" S7 M1 U3 n
#define ITEM_ACTION_TO_STORAGE 0x04 //9c //到储存 STASH E J- f0 q- C8 v+ K8 G
#define ITEM_ACTION_FROM_STORAGE 0x05 //9d 从储存 手上
7 Y5 p' f' h* z, C" C#define ITEM_ACTION_TO_EQUIP 0x06 //9d 装备 装备栏
Q X: Y# }) _# V#define ITEM_ACTION_FROM_EQUIP 0x08 //9d 从装备 手上
, h( f' h) d6 ^6 K5 p#define ITEM_ACTION_SWITCH_EQUIP 0x09 //9d 切装备 -6 C; W. ^3 a! v1 i: m
#define ITEM_ACTION_TO_STORE 0x0B //9c //到商店 商店
0 N( _# u7 U0 ^#define ITEM_ACTION_FROM_STORE 0x0C //9c 从商店 INV) ~! |, U; o5 t+ [
#define ITEM_ACTION_SWITCH_STORAGE 0x0d //9c 转换储存 不知道
0 Z( n3 D& k3 h#define ITEM_ACTION_TO_BELTSLOT 0x0E //9c 去腰带 腰带; l* {4 v% p9 g4 X4 E+ j
#define ITEM_ACTION_FROM_BELTSLOT 0x0F //9c 从腰带 手上2 r) w* n. | R! J
#define ITEM_ACTION_SWITCH_BELTSLOT 0x10 //9c 转换腰带 -
7 E4 A4 k# x# }3 ^ K5 L% w; Z: m# I#define ITEM_ACTION_TO_CURSOR 0x12 //9c 到受伤 手上' u) b0 d# m; C- b4 U6 I/ \3 O. m) @
#define ITEM_ACTION_SHIFT_BELTSLOT 0x15 //9d 切换腰带 -( \) T" V% D: U# _
# X, C3 |3 [) n, E4 ]3 v- N#define PacketItemMaxTick 150
$ O$ E+ T$ d3 C+ Q& a/ Y#define PacketItemPickUpTick 20
( u5 D5 r( M% l0 \7 v$ f. I0 g) r
private:
: _1 |5 v3 d$ |! r* Y( Q7 E' f# U! }0 n static DWORD _PKTItemTick;) H; K5 R& |, }/ G; B' k h) k
static DWORD _PKTItemAction;
* h' f8 y" N5 P static DWORD _PKTItemID;# ?* r: i4 j* I( @. ^3 S
static BYTE _PKTPKTType;
9 y' Y# W O. v4 P6 z7 ^4 \public:
; c8 u( i' i$ M6 e static DWORD PKTItemGetTick() { return _PKTItemTick; }# ^, B6 y M) D, R5 F
0 d5 m' `4 ]+ ]5 h
static void PKTItemRelease() $ `/ i9 ?$ s! x* f
{7 C* Z5 U& w+ ]
_PKTItemTick = 0;
& r" b3 Q5 e$ Q; f2 O9 Z; V3 L- \ _PKTItemAction = 0;# X& w- C; d; h9 i; A% w( I
_PKTItemID = 0;! v( u: y5 `# ]3 c. ]4 v) Q5 S
_PKTPKTType = 0;( F1 a8 Z0 f3 h* e2 L* H
}: N: s8 l: W7 \. M4 `
- F+ N. E4 U e, u3 q# }: v
static void PKTItemTellW8(BYTE aPacket0, DWORD dwItemID, DWORD ItemAction, DWORD tick) 5 ~9 ?; w' y2 V- \# p# A
{. V; A' s8 C; @% Q4 H7 V
_PKTPKTType = aPacket0;# I" f( b7 x) J
_PKTItemTick = tick;3 r) I( X2 E0 r) f% C
_PKTItemAction = ItemAction;+ q4 u1 p' c, C: Z w+ U
_PKTItemID = dwItemID;
5 N1 @$ S& C! j( Q' @9 M w }, P) M* U& l+ l5 E, ?4 ?
+ p/ c1 G! M9 i( Y- _
static void PKTItemTellW8(DWORD tick)
+ G) k; |: K" @0 G Z2 d( [ {# x: I% ~4 Y. a- l$ {7 g
_PKTItemTick = tick;
% w- P, t/ N$ i3 k }
$ j# {% q9 O! g1 ]3 D+ U& l, e: X& a6 H' g3 m
static void PKTItem9C04(BYTE* aPacket, DWORD aLength,UnitAny* pPlayer)//picktocursor
; A1 h4 g% \0 P {8 N& f+ F3 ~3 j4 i
if (aLength >= 8). C0 y( P! C' X: C; k; [1 t
{4 e" ^/ H) _) [4 O: m- e
DWORD dwItemId = 0;
) `& f8 C1 l/ a5 a% s memcpy(&dwItemId, aPacket + 4, sizeof(DWORD));
8 ~6 v, F3 j, }/ o' z, U if (aPacket[0] == PACKET_NEWITEM && aPacket[1] == ITEM_ACTION_TO_STORAGE
, J( u. q) `6 }" ~& q" A && _PKTItemAction == ITEM_ACTION_TO_STORAGE
, }% I# e! h; I- ?7 f: M+ y- V3 z && _PKTPKTType == PACKET_NEWITEM+ }( [6 i. I" }; L& e
)
! W/ W/ r" Q4 v g) ? {
9 ^% V7 m) m" K" w M, ^$ n( i if (_PKTItemID == 0 && _PKTItemTick)
" h; |5 c3 v, f& e {9 o: a) m0 m, L
PKTItemRelease();
i- p! ^6 h, R; Z }" O. Q$ J6 F8 f8 j7 L" D
else if(_PKTItemID== dwItemId&& _PKTItemTick)
, @3 W a* S i- {6 e, T {9 {6 T% U8 ^1 N0 o
PKTItemRelease();0 h# u1 P2 d2 s* R8 ]8 F
}
( K k: |9 m0 I }: r" R1 t, R- _9 ~4 H( c0 U+ M; E3 s
+ ]) y4 M0 Q4 r" B. ?4 j
}
% W% N9 |" }: N# {. Y }9 U$ c- L% a( t; h
7 ~6 }7 U4 C9 m) P/ d+ }& L: j( p5 R
static void PKTItem9D05(BYTE* aPacket, DWORD aLength, UnitAny* pPlayer)//To Stored
4 k% }( c4 r( I4 | {) o+ g k3 A+ W- G- ]
if (aLength >= 8)$ {+ d: e% Q6 ?5 T* A% _1 }; Z
{
! A+ T2 B# j! ]! R! i3 B DWORD dwItemId = 0;
2 ]+ B Q, _; H memcpy(&dwItemId, aPacket + 4, sizeof(DWORD));& I% J' M; H& ?+ b9 }) H8 ?9 M
if (aPacket[0] == PACKET_ITEMACTION && aPacket[1] == ITEM_ACTION_FROM_STORAGE8 Y0 b7 I% i, o* Y7 g- N& t
&& _PKTItemAction == ITEM_ACTION_FROM_STORAGE
3 \8 x* f) {/ q; j# [ && _PKTPKTType == PACKET_ITEMACTION) A6 n/ y( l$ [, u# Y' p( {
)
- t% ?" d0 [- F! m3 w& g1 _" I {
8 k Y) s; _7 D if (dwItemId == 0 && _PKTItemTick)$ Z6 }* }3 K' L. q1 c
{6 U' K3 v: V( v: A0 U
PKTItemRelease();
2 i) W) f4 J: ?7 r4 L5 j, ]5 j }
$ M @4 E2 k# @2 Q' \& R$ \1 n else if (dwItemId == _PKTItemID && _PKTItemTick)- \3 J! ]; K) d
{0 J3 w M V) `5 c
PKTItemRelease();
/ X% Q: B. _3 N1 }: H }
# I5 N" B/ f+ y }! A3 I- `3 L: b
3 f8 n O6 k7 m8 C/ a$ C
}
" x1 U. ~' g7 y% Y! e9 y& t4 W* C }4 d# j/ f4 p, W# n9 M
' ^+ u, S! ~/ |* P+ W9 p
static void PKTItemGameLoop()2 S4 N$ j4 C4 v$ \/ Q
{) v0 S2 p8 M! u) ?# O& Q
if (_PKTItemTick > 0). _1 }. r$ G; d+ ^2 _( `( H" q, c& Q" R
_PKTItemTick--;
/ G7 \7 e* k' \- S else if (_PKTItemTick == 0)
$ i/ m1 U8 o" L. I PKTItemRelease();
7 u! C' M4 g1 T, y }
3 W* d: V6 g0 W$ w. K6 I2 }& Y W- R% b
static BOOL PKTItemCando()
7 m- F! O6 g' |. j! @ { l! ]4 L7 ?; }2 I$ j
if (_PKTItemTick == 0)return TRUE;
' L* Y8 C, J/ X8 W. L5 W1 E3 S+ [: Q return FALSE;
! {/ w5 d- Q5 j6 C) H. i }
0 k% V S$ R. T) R& m) ?& Y* }1 C: [" M$ ^9 q0 E
static BOOL BuyItem(DWORD ItemID, DWORD npcid); K l1 d: S; x) p6 P" f
{5 O0 W4 a, \. D4 C' g2 G) C
PKTItemTellW8(PACKET_NEWITEM, 0, ITEM_ACTION_TO_STORAGE, PacketItemMaxTick);
" C+ m/ ]* ?% X2 V# Q BYTE aPacket[17] = { 0 };
$ S1 e/ w3 X: M! ^ aPacket[0] = 0x32;% U! w9 X1 i1 n# S7 n1 \8 z
::memcpy(&aPacket[1], &npcid, 4);: Y' v$ K1 S9 S# }8 {
::memcpy(&aPacket[5], &ItemID, 4);3 V) s/ ?# A2 C4 t2 P# k: j% B8 J
//return D2Net::D2NetSendPacketToServer(0, aPacket, 17);% p; F/ T& A9 Z2 T$ b
D2Net::D2SendToServer(17, 0, aPacket);
8 l8 o7 G r1 \6 S( g return TRUE;
! N/ m- l! o5 g% ^9 v2 L }
6 }1 L) |9 t( E. A' a4 _
1 a2 i u; f; |3 G/ g; k5 u+ |0 Y static BOOL SellItem(DWORD ItemID, DWORD npcid)
/ C" M, T6 f, n2 k) r {# s0 c* @" l1 h4 I( `, Z6 F
PKTItemTellW8(PACKET_ITEMACTION, 0, ITEM_ACTION_FROM_STORAGE, PacketItemMaxTick);
l1 ~6 A* `/ D: x5 o" C1 B" K$ m6 ~ BYTE aPacket[17] = { 0 };+ U* F$ w9 G% U1 ]$ y; P
aPacket[0] = 0x33;0 a( T8 l1 M9 p" ^, U5 m
::memcpy(&aPacket[1], &npcid, 4);' H' J: h) V- u/ ?7 O/ E; {
::memcpy(&aPacket[5], &ItemID, 4);
: A$ O7 A5 | Z/ ]2 q9 R4 B //return D2Net::D2NetSendPacketToServer(0, aPacket, 17);0 O Q' r+ Q$ j1 Y) E' R, p& d# t
D2Net::D2SendToServer(17, 0, aPacket);
8 k' A6 ?' o7 Z2 N/ h return TRUE;
5 x: b; b0 q5 ?7 x: ^ }
! H. v4 o2 M2 {" [0 x5 Y- y/ |7 r; U! G0 e: v
static BOOL Interact(DWORD nUnitId, DWORD nUnitType);
8 q5 G& ?6 Y6 M8 e4 A" V0 z* ]2 M$ R- o, F
static BOOL PickGroundItem(UnitAny* pItem, BOOL bShowClientMove, BOOL bToCursor);% B# r3 F3 f; i: ^5 M3 J6 s
1 P g P1 ^& ~' t5 Z4 p static BOOL OpenCube()
- z, e3 C8 Y7 o \7 r. R5 `, V {
& O) \) k( d: {4 G( P if (D2Client::D2GetUIToggle(UIVAR_CUBE))return TRUE;$ V K/ s+ U: b0 z: I
9 H% A8 H8 u3 k% }- T5 C
UnitAny* pCube = CountStorageItems(LOC_INV, D2TXTCODE('box '), ITEMQUALITY_NORMAL, NULL);
7 e1 F" H; t9 z/ \' l6 a% B! D if (!pCube)
/ W2 }* A# d$ J" e& U {0 J* j5 M- }+ E; K7 Y8 n/ N3 s6 R
pCube = CountStorageItems(lOC_STASH, D2TXTCODE('box '), ITEMQUALITY_NORMAL, NULL);
% Y( s9 J+ F* j0 a7 G- h% [1 w if (!pCube)
+ n( [, R% c/ B: j$ [ return FALSE;, l' _# F. V4 X3 j
}) q) C# M; W5 S( K7 `5 Q( [5 L
PKTItemTellW8(PacketItemMaxTick);! {- ?' o3 H3 r8 Q" B
]& u4 u+ I$ G
D2CoordStrc mypst = { NULL };% c. ~: S! E0 w) D( Q4 _) a! ^9 `
D2Common::D2GetUnitXY(*D2Client::ptPlayerClient, &mypst);
7 S# u4 A* [: e- k5 y+ {) _
' r' g% f! g: x BYTE aPacket[13] = { 0x20,0 };) U3 @1 }$ D, r( M
::memcpy(aPacket + 1, &pCube->nItemNum, 4);
7 Z) w" |/ e7 m: B/ [+ E$ i ::memcpy(aPacket + 5, &(mypst.nX), 4);
$ x5 P+ l% [+ r0 r, _( `1 s ::memcpy(aPacket + 9, &(mypst.nY), 4);6 H& H' K3 [6 i, |! V+ d5 Z. I
D2Net::D2SendToServer(13, 0, aPacket);
6 I$ `# H( X0 W5 m4 c7 `0 W% V return TRUE;
# s" m: ^0 _4 c" O9 ^ }
* v/ b3 K' p& o* z/ B! |
( X/ h( z: U9 Z& b, d$ i static BOOL ToInvxy(DWORD x, DWORD y)
6 e& K7 h2 D) | {
0 A: S5 g. F1 F UnitAny* phand = D2Common::D2GetCursorItem((*D2Client::ptPlayerClient)->ptInventory);
* x% ~1 H! a* n* k8 x4 c7 ]% z* a$ v1 Z8 D
if (phand == NULL)0 P# l) D: I! P; N, T9 }( t' V: t
return FALSE;
& c& Q! r( d1 n# X$ x3 A$ C% s: m/ p, O; H
PKTItemTellW8(PACKET_NEWITEM, phand->nUnitId, ITEM_ACTION_TO_STORAGE, PacketItemMaxTick);
9 t j6 t C$ S3 `
* u6 A' G9 u& @ BYTE aPacket[17] = { 0x18,0 };
( c! K! L% d v6 }5 M: Q8 `! S ::memcpy(aPacket + 1, &phand->nItemNum, 4);. u! G% Q+ F- W% X9 o; N) K
::memcpy(aPacket + 5, &x, 4);
" h5 l+ _& ?( z4 v2 T ::memcpy(aPacket + 9, &y, 4);; \4 m) A' d( b$ z( L
D2Net::D2SendToServer(17, 0, aPacket);
* R- R$ u$ S& S return TRUE;
0 ^/ m- k4 C& w; c }
, X B" N$ C! p% R9 b R; ], h
3 `1 j. U- p' A# [ static BOOL ToInvRandom(BOOL bBagFix = FALSE)
( W6 @7 M" F" l- [1 f/ z; d/ A& V w {! b, Q8 ~. {1 R o( w! n, q
UnitAny* phand = D2Common::D2GetCursorItem((*D2Client::ptPlayerClient)->ptInventory);( t1 p0 c* f& S1 g. c0 K- b
if (!phand)
5 i5 K, P5 J) P; [1 ]4 E return FALSE;5 q2 m1 h0 w [( @: n# Q
int desx = 0;
, B/ J! ~4 j8 ^ int desy = 0;
9 R. G+ q( J7 l3 J" H) |4 D8 x. L if (GetTheFirstStoragePlace(LOC_INV, phand->dwTxtFileNo, &desx, &desy, bBagFix))( i7 a# N: T8 c6 A$ w# P
{/ W6 i6 d. D5 _5 n; V2 n
ToInvxy(desx, desy);
/ ?( h3 y' M( a- m return TRUE;, r- f3 z$ I, j7 B0 ^* H! h2 l5 ~
}0 I! V& f) e) ]2 Q
return FALSE;
* |4 _ N5 q$ ~, x }* E3 @7 c6 k, o6 z; @" g6 S
( }1 w) O- \9 T8 M1 y static BOOL ToCube()
\) b" Z. h3 o) W: L {% V- n9 h& G- O
if (!(*D2Client::ptPlayerClient))return FALSE;+ g( v3 o& `! C+ f
. u2 I7 I$ i j" D0 \ F; ?: y
UnitAny* phand=D2Common::D2GetCursorItem((*D2Client::ptPlayerClient)->ptInventory);
2 r$ o4 ^: t, K# s2 t if (!phand)return FALSE;$ V0 W* h3 B+ x% T; M4 g9 X
4 A! i* G( y$ q& A UnitAny* pCube = CountStorageItems(LOC_INV, D2TXTCODE('box '), ITEMQUALITY_NORMAL, NULL);//枚举身上的方块
0 o: ^9 D8 Q) E- v: [! V4 a) y) f' c if (!pCube)& ]4 |1 M+ r; u% C0 v6 C4 T# \# n) y3 s
{' r4 X* X3 P7 V
pCube = CountStorageItems(lOC_STASH, D2TXTCODE('box '), ITEMQUALITY_NORMAL, NULL);//枚举仓库里的方块% o5 l- i/ I# n' w
if (!pCube || !pCube->nItemNum)
" }# g- M6 w7 ]! T$ a( \, A return FALSE;; D6 M4 U2 g( t7 T; b$ z1 z
}& w" ?7 H' o3 E4 c }# h
/ h1 ]' \% M) X4 B9 r
if (!IsStorageCanStore(LOC_CUBE, phand->dwTxtFileNo, FALSE))
/ p% J) c( E5 m8 ^ return FALSE;) k6 N7 ]( x! r3 i$ s* Y
- [9 E, |9 R& ]8 o1 r
PKTItemTellW8(PACKET_NEWITEM, phand->nItemNum, ITEM_ACTION_TO_STORAGE, PacketItemMaxTick);. x2 b% C1 R, U- |1 }' N* _9 B1 |
* ~6 ?; ]4 S% d# @: Q
BYTE aPacket[9] = { 0x2A,0 };
" d1 r& ]' u/ J9 T/ D- _0 M4 v6 T& U ::memcpy(aPacket + 1, &phand->nItemNum, 4);$ s/ W9 m. e0 {! B8 i5 e+ w) J& r
::memcpy(aPacket + 5, &pCube->nItemNum, 4);+ ~$ F& y" @8 P# r x
D2Net::D2SendToServer(9, 0, aPacket);
( D0 E" T6 ~! p! b( ?. w return TRUE;4 W! [. H, U5 V: z$ p! V9 q
5 g* |% t( s1 X& |5 ]- ` }3 g, l4 d i4 C3 n. [
$ M( e5 z0 u9 s2 Z [6 g3 J
static BOOL ToCube(DWORD dwhandID, DWORD dwtxtno);, b, p2 |8 H) L6 U8 l( K5 @0 y
/ i" l) K1 V( V5 z/ `, V9 q& K9 c- D
static BOOL RCBag(DWORD dwItemID)//使用之前一定要检查能不能储存1 ~+ U2 U" h5 Q/ A
{
5 M6 n! M" F3 ~/ p7 E D2CoordStrc mypst = { NULL };
0 {4 b4 S2 j% K1 A! ~( m G% O D2Common::D2GetUnitXY(*D2Client::ptPlayerClient, &mypst);' C* ?1 _$ t l: B. L6 m
) B1 C5 t. I% G, d3 ^' M5 F& G6 W
if (!mypst.nX)return FALSE;4 }/ H" \+ U+ ]/ T% [2 ~/ `, B
% @6 T Z- I# f! p7 @. a! F9 @
PKTItemTellW8(PACKET_NEWITEM, 0, ITEM_ACTION_TO_STORAGE, PacketItemMaxTick);8 n9 V1 w0 X; B4 a* [/ `
4 P$ ]- I$ j0 t& z- M BYTE aPacket[13] = { 0x20,0 };
/ T4 X4 ]7 } v+ g ::memcpy(aPacket + 1, &dwItemID, 4);' [9 X8 A) m2 u* R
::memcpy(aPacket + 5, &mypst.nX, 4);
9 q% ]; A- k$ K& x% }0 Y ::memcpy(aPacket + 9, &mypst.nY, 4);
- u! M$ B2 f2 f //return D2Net::D2NetSendPacketToServer(0, aPacket, 13);
7 v: e) F; y6 N8 N( @" a6 \ D2Net::D2SendToServer(13, 0, aPacket);
4 ?, y6 M: ~- n' {( n# f3 d return TRUE;
0 i5 z+ @3 M) ] N }
e9 C. L7 B a0 o' g/ a. t; l8 J7 s$ ^5 E
static BOOL DropCursorItemToGround()3 l4 Q/ D; N- f* Z
{
4 p/ l4 G5 L7 g$ Q- o UnitAny* phand = D2Common::D2GetCursorItem((*D2Client::ptPlayerClient)->ptInventory);
! a& Z. O! L6 T; f if (!phand)& s9 W' v6 {+ F
return FALSE;
- ?+ G, F9 J7 t4 m4 ~2 R$ s: r6 M$ m
PKTItemTellW8(PACKET_NEWITEM, phand->nItemNum, ITEM_ACTION_DROP, PacketItemMaxTick);
! b# S) r3 |; N1 y6 ~- |. o" \* F/ V4 _+ o1 s2 J9 e' M" g; J
BYTE aPacket[5] = { 0x17 };5 j/ W- r, U; g5 V$ Q& `
::memcpy(aPacket + 1, &phand->nItemNum, 4);
$ F4 `9 S! L. x$ b D2Net::D2SendToServer(5, 0, aPacket);1 Z$ w' S, o* @
return TRUE;2 Z% S5 j. c E+ P/ [6 q
& `" \0 V" B! v+ s% F
}- j: ^# _0 ^ v* g& q/ _
& D5 w7 |: b: J! e9 n7 i
static BOOL PickStorageItemToCursor(DWORD dwItemID)
- T9 z5 r: ], {0 g1 U$ G( d8 C {. Z! o/ P( S4 h8 a K
PKTItemTellW8(PACKET_ITEMACTION, dwItemID, ITEM_ACTION_FROM_STORAGE, PacketItemMaxTick);. n& t9 B: N% ]# n
6 \5 |0 i3 p% w" u6 i0 o! @! x! M
BYTE aPacket[5] = { 0 };. Y3 M6 v+ d, o( ~
aPacket[0] = 0x19;
+ U& f1 ^' i/ v. ^ ::memcpy(aPacket + 1, &dwItemID, 4);
7 Y4 G+ k- {& R3 F //return D2Net::D2NetSendPacketToServer(0, aPacket, 5);
7 j; z2 c. f$ Q# c D2Net::D2SendToServer(5, 0, aPacket);; Z2 B" b& o7 U% o4 x( v3 c
return TRUE;
( V0 A2 [! D% m2 C }" J; s# J# B! l5 V$ m" d
D6 M& U& O6 z* m; ?( x static BOOL InteractItem(DWORD ItemID1, DWORD ItemID2)
: D: g2 ?2 v0 w$ n, [. e# } {/ O. h8 E' M. k3 m9 E1 h2 k1 W1 Q
PKTItemTellW8(PACKET_ITEMACTION, ItemID1, ITEM_ACTION_FROM_STORAGE, PacketItemMaxTick);' }1 j: P) }( T2 g1 ^! P
BYTE aPacket[17] = { 0x1f,0 };
" d$ {5 K5 W! | U) U3 A; O: Q ::memcpy(aPacket + 1, &ItemID1, 4);
, }' z9 F/ \; D( d h& M ::memcpy(aPacket + 5, &ItemID2, 4);, l) s) a9 Z, G
//return D2Net::D2NetSendPacketToServer(0, aPacket, 17);- b; L1 F4 i* ~) i- b0 u
D2Net::D2SendToServer(17, 0, aPacket);
0 ]* U' j* T+ G3 s) D8 X return TRUE;4 Q, G" N Z3 Q
}1 Z8 y( }$ k/ O; J
4 M' _- _& v0 r* b3 B static BOOL Transmute()
8 Y. a) \7 k- i. [ {
( _ r0 o* p* d {/ t4 F1 j if (!(*D2Client::ptPlayerClient))return FALSE;
" J2 Z* B, |* [+ y Y/ ?
) [! V- I& d2 s) O' L if (D2Common::D2GetCursorItem((*D2Client::ptPlayerClient)->ptInventory))
: o1 ?7 Y. \% D0 m; ~% {; g* R return FALSE;
) H% }$ a3 {, S
( }" ~- Q/ P& ^6 [1 d PKTItemTellW8(PACKET_NEWITEM, 0, ITEM_ACTION_TO_STORAGE, PacketItemMaxTick);: k. k% ?; d+ [4 M
BYTE aPacket[7] = { 0 };+ I8 w. X( x6 E
aPacket[0] = 0x4f;
6 _# A& C4 k I9 c" b0 ?! D5 G aPacket[1] = 0x18;+ b L: M/ ^+ L$ Z* A5 v, G
D2Net::D2SendToServer(7, 0, aPacket);6 R0 r. s; L) @2 [
return TRUE;
4 t: @, O- n: o7 a5 M/ e/ n" A X }+ k( x5 E3 Q& A# y9 D
};
& C! C+ O4 |' e" W3 H" R6 m. B( s4 M: I% Q o; W4 x, I3 _
|
|