|
|
转载
D9 w+ U* D) z! M: Y自动合成的逻辑过于复杂就不给出了主要就是利用以下汇编点:2 g1 D/ M5 A: Q: c8 t0 a9 [
D2Client:! k+ s: q9 X# w6 [/ T; f
6FB20AE1为拦截输入框(用于获得命令)7 Q* I$ [2 n& B8 x1 Y- l
6FB5E11C为客户端获得0x9C 0x04数据包位置 也就是进入储存的触发 k$ {1 H1 X0 w1 I3 ]
6FB5E8D0为客户端获得0x9D 0x05数据包的位置 也是从储存中提起的触发: K7 h* S( |' w/ _; }: s- {
6FAF4230为hackmap的loop点 我用的hackmap导出位置% n$ V8 b5 a# C* T- a5 ~
% V# N/ u/ F! B2 K6 R: }
( P. Q, q! }4 ]0 n- {$ {: b& k1 i发包函数:- W7 o' E: H3 d* ^# o5 X5 ]
class D2PKT_ITEM0 S* I* E* H# ]0 g: f
{- ^. P% u. L9 o5 \1 l' V: ? w
#define ITEM_ACTION_NEW_GROUND 0x00 //9c//新产生在地上 地上
$ p2 [4 }# Z: O8 M4 |2 v5 t#define ITEM_ACTION_PICK_UP 0x01 //9c//拾取 多) n( Q( ~2 l& l
#define ITEM_ACTION_DROP 0x02 //9c//丢弃 地上6 P$ y: o& l6 ]! Q- t
#define ITEM_ACTION_OLD_GROUND 0x03 //9c//旧的地上 地上
* m" K0 X; i" F& c#define ITEM_ACTION_TO_STORAGE 0x04 //9c //到储存 STASH
/ T' `$ c' J+ ^' [! C#define ITEM_ACTION_FROM_STORAGE 0x05 //9d 从储存 手上* C( U4 }; b" }
#define ITEM_ACTION_TO_EQUIP 0x06 //9d 装备 装备栏+ W1 H( f+ g' @' o+ F8 B9 e
#define ITEM_ACTION_FROM_EQUIP 0x08 //9d 从装备 手上
2 L. n: Z! O: L2 ]. Q3 C' u3 m#define ITEM_ACTION_SWITCH_EQUIP 0x09 //9d 切装备 -" @2 `( l8 E2 b! b
#define ITEM_ACTION_TO_STORE 0x0B //9c //到商店 商店( T& p; Z$ [7 l* ^" x/ S! o' V
#define ITEM_ACTION_FROM_STORE 0x0C //9c 从商店 INV! x9 e8 f) l, e2 K3 l r9 L! v; y
#define ITEM_ACTION_SWITCH_STORAGE 0x0d //9c 转换储存 不知道
: \: @5 ?5 M6 ?; h5 R#define ITEM_ACTION_TO_BELTSLOT 0x0E //9c 去腰带 腰带+ f* n% s+ p; I% i
#define ITEM_ACTION_FROM_BELTSLOT 0x0F //9c 从腰带 手上
* x5 l, W) e N#define ITEM_ACTION_SWITCH_BELTSLOT 0x10 //9c 转换腰带 - V) \( q/ X% b X$ J$ g
#define ITEM_ACTION_TO_CURSOR 0x12 //9c 到受伤 手上5 x1 e( y# P8 Y6 y/ L. m
#define ITEM_ACTION_SHIFT_BELTSLOT 0x15 //9d 切换腰带 -
% t. N/ w* A/ }* y
6 \5 X8 D0 Q1 H+ }1 I/ G# J#define PacketItemMaxTick 150
# D- k) Q( v# U#define PacketItemPickUpTick 20
) C% T2 H7 j' [6 O, r( ~5 ]. v0 F/ Q7 L. a0 H2 o! P5 R) F
private:7 W8 h9 Z) r0 v
static DWORD _PKTItemTick;
- l! i3 k6 _5 P& l; {2 D# ] static DWORD _PKTItemAction;
) ^8 v1 X- O+ l" F: @' E( Z static DWORD _PKTItemID;; a( x; ^' ~: I N% I, t
static BYTE _PKTPKTType;2 n' {3 z. w& Q1 ?
public:1 j/ F. D- ~9 ~' B: V$ t( ~
static DWORD PKTItemGetTick() { return _PKTItemTick; }
! `+ U# ^3 `' H& l
; g0 C' G' H" V0 t' B, z q! j* w static void PKTItemRelease()
& V) E: E$ a* ^. l) ~4 I. o {3 _& n' i. Z& i( v: }
_PKTItemTick = 0;
! _% R0 n5 V# M: x# X n _PKTItemAction = 0;
3 [7 B1 _- [" G2 E: h: K0 b+ W _PKTItemID = 0;
2 w- _' @+ Y8 b- S/ m {( u2 y" ] _PKTPKTType = 0;
, ] R1 T8 c0 e5 ], v2 ?! C& I }
9 q+ X3 {, B; S4 B. \, @5 @" ]/ j% `) i0 l! k1 m- }- p" D
static void PKTItemTellW8(BYTE aPacket0, DWORD dwItemID, DWORD ItemAction, DWORD tick) 9 `7 h+ I% W B! g0 p% @: {
{
; z" P9 k- \: f8 _& u9 z _ _PKTPKTType = aPacket0;5 C( @5 W% O2 D( P# m
_PKTItemTick = tick;: N* K/ x6 s" O) y% B A, L' c
_PKTItemAction = ItemAction;9 V) K, g, t2 {: U8 i
_PKTItemID = dwItemID;1 B' i" F& S6 f8 C8 D
}9 e/ C& o* o9 L8 i+ s
; n6 {! }6 C3 l, Y+ ~ d static void PKTItemTellW8(DWORD tick)- P7 K1 N$ q3 j: v
{
' }! D. G/ F+ |3 u/ ]/ l _PKTItemTick = tick;& s& e w! ^2 G
}1 B- c4 V: w% }# E8 U! {9 Q
! K: q! A5 d" N% L static void PKTItem9C04(BYTE* aPacket, DWORD aLength,UnitAny* pPlayer)//picktocursor
% ^9 G m. c/ k$ a {# R D$ }5 p. o5 C& X. F2 D' y
if (aLength >= 8)
, j$ r9 ^( Y* k) G {8 h$ Z o9 O* }+ t m+ c
DWORD dwItemId = 0;: c; i& q. ^8 u; G
memcpy(&dwItemId, aPacket + 4, sizeof(DWORD));
4 x7 d R7 e3 j! m1 y: E if (aPacket[0] == PACKET_NEWITEM && aPacket[1] == ITEM_ACTION_TO_STORAGE) H8 z* G! y8 l" x/ o+ q
&& _PKTItemAction == ITEM_ACTION_TO_STORAGE
/ ?( _; P; B5 o4 @9 p# x+ ? && _PKTPKTType == PACKET_NEWITEM
. _! v. R' f) A& h! I$ X% B ), t P) P0 x+ A
{, y) f$ _1 ?7 X! B5 r e \8 M
if (_PKTItemID == 0 && _PKTItemTick)! Z, Z, v* m. g7 y9 [' D
{% U/ o$ G- q! P/ Y s
PKTItemRelease();% Z0 D! }9 D! Y( @5 F. t: I- x
}
: W6 R) g# R3 V% B! I$ n else if(_PKTItemID== dwItemId&& _PKTItemTick)3 J' n- i2 v: ?, A
{, b& V$ c( `# u
PKTItemRelease();
7 G0 J9 m1 s0 K F( j2 d& R }% ]9 L! L- Z- z: g& L' b/ H
}
2 H8 Z% l1 m5 @! q ~ & ?# }: z4 ^2 U* s+ c1 l3 R
}- v% u3 E4 h4 y' |
}+ U+ G- T, J: k* C6 F
$ l+ D' S; S2 H
static void PKTItem9D05(BYTE* aPacket, DWORD aLength, UnitAny* pPlayer)//To Stored
" ~- p& Y. r3 X {
& W5 s: l6 `3 v* R8 Q1 @ if (aLength >= 8)
$ D2 u! i/ X" P+ Q6 X- q+ t {
: M9 A( v5 ?+ Y. f3 o$ t DWORD dwItemId = 0;
7 _3 E+ s" D, P* [0 B memcpy(&dwItemId, aPacket + 4, sizeof(DWORD));
4 J1 a* M& M D! M7 A8 `" | if (aPacket[0] == PACKET_ITEMACTION && aPacket[1] == ITEM_ACTION_FROM_STORAGE6 i# |+ w0 p* j/ {, V5 y3 p
&& _PKTItemAction == ITEM_ACTION_FROM_STORAGE ^2 q3 v1 w; [8 J2 H
&& _PKTPKTType == PACKET_ITEMACTION9 d4 v7 Z r5 N8 S( X
): e4 W. A/ l; x3 @, w6 z ?# W: ]( w
{
% P0 N( d" U. F. r# V7 M3 Y if (dwItemId == 0 && _PKTItemTick)3 j8 D# D6 s U& Y& `, L
{* h- F* K$ } b
PKTItemRelease();# ~+ i/ O* C6 L
}
1 H \" A1 P% U e, L( V else if (dwItemId == _PKTItemID && _PKTItemTick)
: @9 B' `! V8 d2 N, M' \3 M {
$ N) z7 R+ \7 T3 \ PKTItemRelease();) `- N3 i, }/ V) T3 v: K2 F* C
}+ v& X1 c$ H( b' V2 H4 n
}& J9 Q6 [# s! y# D; K: w/ r3 S: f
% l8 Z3 x8 e/ b6 i }
) I9 e2 Y5 Y6 x2 _: ]2 G8 [ }) C0 T' f# o" v3 I7 j
7 Z! w1 ]; |: k: h, a2 ?5 ], ?" y
static void PKTItemGameLoop()4 w/ V# S Y+ p6 |7 z
{
8 J2 t% `1 {% g1 B/ g if (_PKTItemTick > 0)
& U J$ F! n: a* w3 C3 A7 C- f3 n _PKTItemTick--;! b, J. K- X, T! l$ Z3 a& |' E8 B
else if (_PKTItemTick == 0)
/ q: Y& }8 z( P9 P0 _0 ?! B( \ PKTItemRelease();4 }0 p. ~0 n$ b; y& }0 d5 o1 |
}
- k" z# v- d0 |& W0 A. d- k& ~9 C) w$ N7 f' |7 V: I' l/ U
static BOOL PKTItemCando()
2 l/ s- s$ z8 W$ ]6 J {
! r Z) n; I) S/ _ [. s( I if (_PKTItemTick == 0)return TRUE;9 A! [. G; Z( g4 G8 r, L$ h% v$ H
return FALSE;. y8 U- k, [7 ?
}( u D! O7 J, [3 n2 F: P
; g/ i+ ?. V3 U. f( F7 r7 E: f8 W static BOOL BuyItem(DWORD ItemID, DWORD npcid)! F, v" d% L Z: ~! z. q
{" _: d" o5 p, }
PKTItemTellW8(PACKET_NEWITEM, 0, ITEM_ACTION_TO_STORAGE, PacketItemMaxTick);
6 `0 a- H- s5 q9 h6 w BYTE aPacket[17] = { 0 };
# e! q. s$ v; N# N" H* G aPacket[0] = 0x32;! g h: Y& L) p5 h5 _
::memcpy(&aPacket[1], &npcid, 4);
2 {# M/ i$ M1 g. m- o ::memcpy(&aPacket[5], &ItemID, 4);
) Q" t6 r" J+ S$ P3 [ //return D2Net::D2NetSendPacketToServer(0, aPacket, 17);& G }* @2 N5 Y; n
D2Net::D2SendToServer(17, 0, aPacket);
- G+ E+ ?# V: Z$ w- o) f return TRUE;
5 }! E' f4 Z6 P$ C: A6 B5 O }
: _5 q* K) E# _7 t4 v u6 r# Z& [, k- [
static BOOL SellItem(DWORD ItemID, DWORD npcid)
. [) k' w, I( b/ X5 _- c. P {* u0 u* }$ L2 I1 V
PKTItemTellW8(PACKET_ITEMACTION, 0, ITEM_ACTION_FROM_STORAGE, PacketItemMaxTick);
) f! O9 k8 w/ l0 d1 ` BYTE aPacket[17] = { 0 };
: \" C5 o6 C- c; e2 t& X2 a aPacket[0] = 0x33;
3 ?1 }9 \+ C- g5 C; Y ::memcpy(&aPacket[1], &npcid, 4);
4 X. A* i- p7 P2 N! w* H ::memcpy(&aPacket[5], &ItemID, 4);
" z7 m! z5 F4 G/ F# R //return D2Net::D2NetSendPacketToServer(0, aPacket, 17);
6 Q" x0 J; \2 m: U8 q D2Net::D2SendToServer(17, 0, aPacket);# {& x& }: T& W7 C, @
return TRUE;
; @/ I, [! K4 a3 f/ g; n/ H }
: N/ q" |0 W3 o3 Y5 I A+ [0 E9 R) e9 K% \$ B& a9 Q
static BOOL Interact(DWORD nUnitId, DWORD nUnitType);2 n S n) t: g
" g# O4 G/ J/ ^. |1 d" z9 }$ p static BOOL PickGroundItem(UnitAny* pItem, BOOL bShowClientMove, BOOL bToCursor);
. I* G7 o* N( R8 P
% s5 p+ B+ l5 q' h5 g0 H: ` static BOOL OpenCube()
2 b- |! X& Y; R+ ]) q, J: w5 r {
5 k4 L+ h: u& T$ h/ ]+ X/ k if (D2Client::D2GetUIToggle(UIVAR_CUBE))return TRUE;/ _6 T$ `9 q5 |2 M6 z+ e% i/ o) W
8 ^6 A2 j9 i) b# }6 D$ T$ H0 c UnitAny* pCube = CountStorageItems(LOC_INV, D2TXTCODE('box '), ITEMQUALITY_NORMAL, NULL);
\+ k* {# V" ^0 L$ p if (!pCube)
* A5 n C8 R9 r6 `6 f {
; Q% G5 E) C- d1 _ pCube = CountStorageItems(lOC_STASH, D2TXTCODE('box '), ITEMQUALITY_NORMAL, NULL);
X E' E! d, |2 K: \ if (!pCube)8 J3 Y- c% G7 g
return FALSE;
, K# l3 a8 D W }
/ `) `/ K# w' \$ g! p4 L6 Z PKTItemTellW8(PacketItemMaxTick);
w/ Z- L, S! G7 T" K2 {
" t- Y& M8 `# o3 H l N. o5 c, H D2CoordStrc mypst = { NULL };
0 [" m5 Q4 V8 T X7 G D2Common::D2GetUnitXY(*D2Client::ptPlayerClient, &mypst);
/ F1 s9 W" q, G) [+ W& Y1 ?* C. I$ |& w5 i
BYTE aPacket[13] = { 0x20,0 };+ z; {: i( Y3 q E
::memcpy(aPacket + 1, &pCube->nItemNum, 4);3 {; ]0 N( U+ r1 ?# i0 |
::memcpy(aPacket + 5, &(mypst.nX), 4);' A- |) U% x0 B5 V6 y2 Q* a- }
::memcpy(aPacket + 9, &(mypst.nY), 4);) a2 `: {0 O4 D5 v0 ^$ J
D2Net::D2SendToServer(13, 0, aPacket);; ^1 p$ F4 x7 I/ v
return TRUE;) \) X0 C% f% J9 \1 x# b/ F
}
. S9 V& C1 M; g4 e6 z* t4 X+ R8 [7 u' K# j
static BOOL ToInvxy(DWORD x, DWORD y)
T$ j- W7 I5 S9 T' T% i2 i: K* |! s2 ] {9 a9 ^9 v }# V
UnitAny* phand = D2Common::D2GetCursorItem((*D2Client::ptPlayerClient)->ptInventory);0 A2 C% D! x- M3 s
6 c0 i3 G, {2 T/ \: _9 [0 h3 S% `( z if (phand == NULL)
]8 d% I' t' b' m J return FALSE;
# Z' f) ^ [* @& d( W% I( m T3 d l; [2 p
PKTItemTellW8(PACKET_NEWITEM, phand->nUnitId, ITEM_ACTION_TO_STORAGE, PacketItemMaxTick);6 I7 A5 U8 B+ F: E) v
1 r, V9 w$ V$ p1 ?* {7 }/ g; M BYTE aPacket[17] = { 0x18,0 };7 N9 ]7 k z- B: d9 L3 Z& N
::memcpy(aPacket + 1, &phand->nItemNum, 4);1 M4 v( U+ C* e
::memcpy(aPacket + 5, &x, 4);& b+ R' t0 @( j. z( q7 `
::memcpy(aPacket + 9, &y, 4);' E( d4 A& b8 E2 D" Y# B
D2Net::D2SendToServer(17, 0, aPacket);: C# y m' u0 R u$ c
return TRUE;9 u3 l ]0 ^, m% P, b( W
}
1 U7 ]9 r) ?+ [ I) p0 u; k; o$ {7 s2 H3 }. ?
static BOOL ToInvRandom(BOOL bBagFix = FALSE)
2 G% A( V" _. I; l) h6 E7 p {
# O; k! W2 A/ l. b+ i UnitAny* phand = D2Common::D2GetCursorItem((*D2Client::ptPlayerClient)->ptInventory);
* n. r* [! s5 l0 y5 P if (!phand)7 H6 }6 Z' j: ~( {9 ~+ U
return FALSE;
2 Y. V0 {% N$ ], L4 h( i int desx = 0;, t1 T2 i$ H N$ o/ D
int desy = 0;
+ ?0 p* a5 w8 F7 l( {9 {8 f# l+ L if (GetTheFirstStoragePlace(LOC_INV, phand->dwTxtFileNo, &desx, &desy, bBagFix))
! y+ s8 ]" x+ Q0 o9 W8 Z3 @ {! M& B4 i. q9 R/ U, w& K
ToInvxy(desx, desy);) Y2 G1 d: p( r
return TRUE;
8 ?4 _' H' X2 ] }. {; `3 B, n$ U K% N: Q
return FALSE;
, f- d# ~1 x9 v- [! p9 C }2 v1 @$ @3 ^/ M$ Z1 b
; R8 r7 f# u9 q; z7 t% _8 k static BOOL ToCube(): H( a4 |, l; f, Q3 m
{
6 w3 |( c; d+ M, b" S2 L6 l if (!(*D2Client::ptPlayerClient))return FALSE;8 t7 e; K3 ] j) M" t
; B! ?& ?3 _3 s! ?$ c! c' w UnitAny* phand=D2Common::D2GetCursorItem((*D2Client::ptPlayerClient)->ptInventory);
5 @6 \3 J6 T" [! e5 v if (!phand)return FALSE;
9 R6 n3 |; L7 ~, e- Z: m
) Y' Q C% [0 C# C8 ? UnitAny* pCube = CountStorageItems(LOC_INV, D2TXTCODE('box '), ITEMQUALITY_NORMAL, NULL);//枚举身上的方块; E3 h- I- }# g/ e, D
if (!pCube)( c& O s& u2 z
{
; o7 r# h2 E7 @, n pCube = CountStorageItems(lOC_STASH, D2TXTCODE('box '), ITEMQUALITY_NORMAL, NULL);//枚举仓库里的方块
6 _/ J+ `* [/ U' A' K if (!pCube || !pCube->nItemNum)
9 T" _ h9 T" t& r, D$ Z6 X return FALSE;
7 P: K5 V* l: I4 R6 ], G }* ? b4 u% K! t& Y" s' I! _9 u
/ Z- Q: A3 i4 N, S' m/ v1 V
if (!IsStorageCanStore(LOC_CUBE, phand->dwTxtFileNo, FALSE))
6 k0 G3 e* C! n# n0 m! [; f" M* ? return FALSE;' ?' y" e7 h! R- ^7 T
& q5 ~* {: r4 h. z" i0 G PKTItemTellW8(PACKET_NEWITEM, phand->nItemNum, ITEM_ACTION_TO_STORAGE, PacketItemMaxTick);7 w. t0 p# @- z- [3 N" O* L
9 B# L9 R3 F/ l5 l BYTE aPacket[9] = { 0x2A,0 };, I. b* j5 b, T4 [! [& F
::memcpy(aPacket + 1, &phand->nItemNum, 4);
3 M+ |6 X! Z, h* \" D ::memcpy(aPacket + 5, &pCube->nItemNum, 4);
" {& C- u. |- F& m4 p D2Net::D2SendToServer(9, 0, aPacket);
v% E4 K* T% Q, { return TRUE;5 `7 P M& H5 G" V
3 q- x4 q9 D q5 g8 l# v6 S3 f
}4 y* t( M4 a2 g& {( M
5 |$ t8 x- b& Q/ c+ f static BOOL ToCube(DWORD dwhandID, DWORD dwtxtno);9 @6 |- v% a/ w
# k. s& @; u* N static BOOL RCBag(DWORD dwItemID)//使用之前一定要检查能不能储存0 z& w' ]" n' e3 c
{
) r* m; t& O+ W* `- F1 C D2CoordStrc mypst = { NULL };
1 [6 C$ O5 m7 O* @9 v4 z6 Q; h D2Common::D2GetUnitXY(*D2Client::ptPlayerClient, &mypst);. ?4 x6 _! S) J$ `
) Y8 R# X- `7 |( i; a7 w m' |1 k
if (!mypst.nX)return FALSE;1 Q7 a( M; G- \- I/ w+ N$ X# k
* p3 I( f" M" T( y" K) Y
PKTItemTellW8(PACKET_NEWITEM, 0, ITEM_ACTION_TO_STORAGE, PacketItemMaxTick);
& i" k9 f8 Z2 e- j3 ^
+ a3 s2 B' {& ~' A8 X0 {2 D BYTE aPacket[13] = { 0x20,0 };
# g; S6 j7 B/ j8 |, U ::memcpy(aPacket + 1, &dwItemID, 4);0 ^! D/ h* d. k2 Y& Q
::memcpy(aPacket + 5, &mypst.nX, 4);5 X5 t: \: b9 \8 }$ a2 d
::memcpy(aPacket + 9, &mypst.nY, 4);( C' ^# ~- t( Y5 i# V# c3 Y
//return D2Net::D2NetSendPacketToServer(0, aPacket, 13);
2 r% d4 Q( D/ ^' T' Y3 [ D2Net::D2SendToServer(13, 0, aPacket);+ A$ a/ G0 p% s. z
return TRUE;
1 }% B3 o- |* w0 Q }
5 d4 @3 C5 A8 X; k4 n; M
" w% `4 I5 E5 v' V1 H4 v static BOOL DropCursorItemToGround()2 x' r. | g% H" Y! `- I2 `& W
{
) f3 Q1 ~( a0 v9 N+ S. B) D9 U. a, B UnitAny* phand = D2Common::D2GetCursorItem((*D2Client::ptPlayerClient)->ptInventory);
, g* X+ s0 z1 ?9 A0 _% i if (!phand)8 k7 _1 |- h/ L9 W I3 x
return FALSE;8 E7 [6 [# I2 O8 N) V4 {9 x
7 W* Q3 G0 J* \" T PKTItemTellW8(PACKET_NEWITEM, phand->nItemNum, ITEM_ACTION_DROP, PacketItemMaxTick);
7 ~5 v5 h3 u) C" }* A1 M7 y: _( K0 R0 B; |7 G6 t
BYTE aPacket[5] = { 0x17 };
" c7 M9 E" F3 _5 M4 M/ i ::memcpy(aPacket + 1, &phand->nItemNum, 4);, \( b7 F- u8 O8 L8 |# i
D2Net::D2SendToServer(5, 0, aPacket);% e! @3 X0 h/ y! D* h- R
return TRUE;& Y- q* ~0 O; E" m
9 {5 d% Z. t3 U f `7 o$ C }
2 N8 b' g/ \- i" T/ X; d8 w0 d# }0 x W9 M4 o5 U
static BOOL PickStorageItemToCursor(DWORD dwItemID)
, M2 @9 m, s! w6 ?- A C {& x/ C0 s! i" }, E- t
PKTItemTellW8(PACKET_ITEMACTION, dwItemID, ITEM_ACTION_FROM_STORAGE, PacketItemMaxTick);$ ]: I1 R) J! y1 m9 q! e: j
' c( u. @: e, f/ |5 Z6 D
BYTE aPacket[5] = { 0 };
/ |/ o* m% P% o. s/ [ aPacket[0] = 0x19;9 h+ e, g: h6 G$ f6 e6 X/ S
::memcpy(aPacket + 1, &dwItemID, 4);8 p. S3 ^7 m( X8 ]
//return D2Net::D2NetSendPacketToServer(0, aPacket, 5);/ z( ^* I3 E$ {; m1 N
D2Net::D2SendToServer(5, 0, aPacket);' [$ y6 X1 W. q* J8 n" S
return TRUE;1 [, o q# {0 _
}' C3 N& Q+ _6 e8 u/ P* E# Q
F: t. J/ D$ U( W$ S" \" h static BOOL InteractItem(DWORD ItemID1, DWORD ItemID2)
5 _3 ^6 O1 t" } {" k3 `% t0 B3 w- h+ A
PKTItemTellW8(PACKET_ITEMACTION, ItemID1, ITEM_ACTION_FROM_STORAGE, PacketItemMaxTick);! b: y! b3 B* ^: r5 T% g
BYTE aPacket[17] = { 0x1f,0 };$ l/ V0 |9 X1 M. i4 Z6 |
::memcpy(aPacket + 1, &ItemID1, 4);' T+ n7 D5 M7 R# g
::memcpy(aPacket + 5, &ItemID2, 4);
" @+ y) I/ ]/ T$ x; D //return D2Net::D2NetSendPacketToServer(0, aPacket, 17);
3 V D& b- ?7 ?- m3 c D2Net::D2SendToServer(17, 0, aPacket);2 o" m7 S9 c/ a2 p
return TRUE;
$ W1 J$ F& i r* I o7 [9 \ }
/ }4 p( X5 R& r) f+ d l- g! p" l8 k+ D) A2 ^6 t- j
static BOOL Transmute()( D1 x5 |" b/ W
{) R2 v6 h1 s2 m
if (!(*D2Client::ptPlayerClient))return FALSE;
* |# t! `4 x U0 y
9 T5 w. U; F$ m+ D$ D if (D2Common::D2GetCursorItem((*D2Client::ptPlayerClient)->ptInventory))
# K8 M2 h, y# |; Y4 R( I0 [8 r return FALSE;% Z8 z( \5 `4 h# x9 [
$ G. y- |! c0 v! ]$ L# z9 c PKTItemTellW8(PACKET_NEWITEM, 0, ITEM_ACTION_TO_STORAGE, PacketItemMaxTick);
/ n: s/ _8 Q8 d$ i5 J" X( N# { BYTE aPacket[7] = { 0 };6 H. ` Q0 t6 p; |9 g1 U b
aPacket[0] = 0x4f;
& L$ z1 }/ K1 b& i; U aPacket[1] = 0x18;
+ ?- L$ j8 }; ~' j( c* Z. @! | D2Net::D2SendToServer(7, 0, aPacket);% _* p& z2 S. L
return TRUE;! \1 N/ b6 v' O# ?8 @9 f
}; B, A) |% n) `
};
) f; B' y$ g% v1 W2 U8 a% T) y8 ~, z X+ G( N' J
|
|