-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathinventory_oCMob.d
364 lines (283 loc) · 9.14 KB
/
inventory_oCMob.d
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
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
/*
* func void oCMobContainer_Remove (var int mobPtr, var int itmPtr){
*/
/*
* Removes Item from oCMobContainer
* mobPtr pointer to oCMobContainer
* itmPtr pointer to oCItem in oCMobContainer
* Usage:
* oCMobContainer_Remove(mobPtr, itmPtr);
*/
func void oCMobContainer_Remove (var int mobPtr, var int itmPtr){
//0x00683EB0 public: virtual void __thiscall oCMobContainer::Remove(class oCItem *)
const int oCMobContainer__Remove_G1 = 6831792;
//0x00725FF0 public: virtual void __thiscall oCMobContainer::Remove(class oCItem *)
const int oCMobContainer__Remove_G2 = 7495664;
if (!Hlp_Is_oCMobContainer (mobPtr)) { return; };
if (!Hlp_Is_oCItem (itmPtr)) { return; };
const int call = 0;
if (CALL_Begin(call)) {
CALL_PtrParam (_@ (itmPtr));
CALL__thiscall (_@ (mobPtr), MEMINT_SwitchG1G2 (oCMobContainer__Remove_G1, oCMobContainer__Remove_G2));
call = CALL_End();
};
};
/*
* I was hoping this one removes item from oCMobContainer without dicarding it - but returned pointer is 0
*
func int oCMobContainer_GetRemoved (var int mobPtr, var int itmPtr, var int amount){
//0x00683F40 public: virtual class oCItem * __thiscall oCMobContainer::Remove(class oCItem *,int)
const int oCMobContainer__Remove_G1 = 6831936;
//0x00726080 public: virtual class oCItem * __thiscall oCMobContainer::Remove(class oCItem *,int)
const int oCMobContainer__Remove_G2 = 7495808;
if (!Hlp_Is_oCMobContainer (mobPtr)) { return 0; };
if (!Hlp_Is_oCItem (itmPtr)) { return 0; };
const int call = 0;
if (CALL_Begin(call)) {
CALL_IntParam (_@ (amount));
CALL_PtrParam (_@ (itmPtr));
CALL__thiscall (_@ (mobPtr), MEMINT_SwitchG1G2 (oCMobContainer__Remove_G1, oCMobContainer__Remove_G2));
call = CALL_End();
};
var int retVal; retVal = CALL_RetValAsPtr ();
B_Msg_Add (IntToString (retVal));
return retVal;
};
*/
func void oCMobContainer_Insert (var int mobPtr, var int itmPtr){
//0x00683E80 public: virtual void __thiscall oCMobContainer::Insert(class oCItem *)
const int oCMobContainer__Insert_G1 = 6831744;
//0x00725FC0 public: virtual void __thiscall oCMobContainer::Insert(class oCItem *)
const int oCMobContainer__Insert_G2 = 7495616;
if (!Hlp_Is_oCMobContainer (mobPtr)) { return; };
if (!Hlp_Is_oCItem (itmPtr)) { return; };
const int call = 0;
if (CALL_Begin(call)) {
CALL_PtrParam (_@ (itmPtr));
CALL__thiscall (_@ (mobPtr), MEMINT_SwitchG1G2 (oCMobContainer__Insert_G1, oCMobContainer__Insert_G2));
call = CALL_End();
};
};
//0x00726190 public: virtual void __thiscall oCMobContainer::CreateContents(class zSTRING const &)
/*
*
* This package 'sparkled' from Neconspictor's post about 'Mob_RemoveAllItems' function.
* Original post here: https://forum.worldofplayers.de/forum/threads/1449528-Mob_RemoveItems?p=24599541&viewfull=1#post24599541
*
* func int oCMobContainer_GetItemPtrBySlot (var int mobPtr, var int itemSlot)
* func void Mob_RemoveAllItems (var int mobPtr)
* func void Mob_RemoveItems (var int mobPtr, var int itemInstance, var int qty)
* func void Mob_TransferItemsToNPC (var int mobPtr, var int slfInstance)
*/
/*
* Returns pointer to oCItem in a specific inventory slot in a chest
* mobPtr pointer to oCMobContainer
* itemSlot slot number (starts with 0)
* Usage:
* itemPtr = oCMobContainer_GetItemPtrBySlot (her.focus_vob, 0);
*/
func int oCMobContainer_GetItemPtrBySlot (var int mobPtr, var int itemSlot){
if (!Hlp_Is_oCMobContainer (mobPtr)) { return 0 ; };
var int ptr;
var int itmPtr;
var zCListSort list;
var oCMobContainer container; container = _^ (mobPtr);
var int i; i = 0;
ptr = container.containList_next;
while (ptr);
list = _^ (ptr);
itmPtr = list.data;
if (itmPtr) {
if (itemSlot == i) {
return itmPtr;
};
i += 1;
};
ptr = list.next;
end;
return 0;
};
/*
* Removes from oCMobContainer all items
* mobPtr pointer to oCMobContainer
* itemSlot slot number (starts with 0)
* Usage:
* Mob_RemoveAllItems (her.focus_vob);
*/
func void Mob_RemoveAllItems (var int mobPtr){
if (!Hlp_Is_oCMobContainer (mobPtr)) { return; };
var int ptr;
var oCMobContainer container; container = _^(mobPtr);
var zCListSort list;
ptr = container.containList_next;
while (ptr != 0);
list = _^(ptr);
var int itmPtr; itmPtr = list.data;
if (itmPtr == 0) {
ptr= list.next;
} else {
oCMobContainer_Remove(mobPtr, itmPtr);
ptr = container.containList_next;
};
end;
};
/*
* Removes from oCMobContainer 1 item
* mobPtr pointer to oCMobContainer
* itemInstance item instance
* qty qty to be removed
* Usage:
* Mob_RemoveItems (her.focus_vob, ItarScrollFireBolt, 1);
*/
func void Mob_RemoveItems (var int mobPtr, var int itemInstance, var int qty){
if (!Hlp_Is_oCMobContainer (mobPtr)) { return; };
var oCItem itm;
var int itmPtr; itmPtr = 1;
var int i; i = 0;
//Loop through all inventory slots to find itemInstance
while (itmPtr);
itmPtr = oCMobContainer_GetItemPtrBySlot (mobPtr, i);
if (itmPtr) {
itm = _^ (itmPtr);
if (Hlp_GetInstanceID (itm) == itemInstance) {
if (itm.amount > qty) {
//Adjust qty - is this okay?
itm.amount = (itm.amount - qty);
} else {
//Remove everything
oCMobContainer_Remove (mobPtr, itmPtr);
};
return;
};
};
i += 1;
end;
};
/*
* Transfers all items from oCMobContainer to NPC
* mobPtr pointer to oCMobContainer
* slfInstance NPC instance
* Usage:
* Mob_TransferItemsToNPC (her.focus_vob, hero);
*/
var int _MobTransferItem_Event;
var int _MobTransferItem_Event_Enabled;
var int _MobTransferItem_Method;
const int MobTransferItem_ToNpc = 1;
const int MobTransferItem_MoveToMob = 2;
const int MobTransferItem_CopyToMob = 3;
var int _MobTransferItem_ToNpcPtr;
func void MobTransferItemEvent_Init () {
if (!_MobTransferItem_Event) {
_MobTransferItem_Event = Event_Create ();
};
};
func void MobTransferItemEvent_AddListener (var func f) {
Event_AddOnce (_MobTransferItem_Event, f);
};
func void MobTransferItemEvent_RemoveListener (var func f) {
Event_Remove (_MobTransferItem_Event, f);
};
func void Mob_TransferItemsToNPC (var int mobPtr, var int slfInstance){
if (!Hlp_Is_oCMobContainer (mobPtr)) { return; };
var C_NPC slf; slf = Hlp_GetNPC (slfInstance);
if (!Hlp_IsValidNPC (slf)) { return; };
_MobTransferItem_ToNpcPtr = _@(slf);
_MobTransferItem_Method = MobTransferItem_ToNpc;
var oCItem itm;
var int i;
var int ptr;
var oCMobContainer container; container = _^ (mobPtr);
var zCListSort list;
ptr = container.containList_next;
while (ptr != 0);
list = _^(ptr);
var int itmPtr; itmPtr = list.data;
if (itmPtr == 0) {
ptr = list.next;
} else {
itm = _^ (itmPtr);
//Custom prints for transferred items
if ((_MobTransferItem_Event) && (_MobTransferItem_Event_Enabled)) {
Event_Execute (_MobTransferItem_Event, itmPtr);
};
var int itemInstanceID; itemInstanceID = Hlp_GetInstanceID(itm);
if ((itm.flags & ITEM_MULTI) == ITEM_MULTI) {
CreateInvItems(slf, itemInstanceID, itm.amount);
} else {
i = 0;
while (i < itm.amount);
//We have to create items in a loop using CreateInvItem function (because of items without ITEM_MULTI flag)
CreateInvItem(slf, itemInstanceID);
i += 1;
end;
};
oCMobContainer_Remove(mobPtr, itmPtr);
ptr = container.containList_next;
};
end;
};
func void Mob_TransferItemsToMob (var int mobPtr1, var int mobPtr2){
if (!Hlp_Is_oCMobContainer (mobPtr1)) { return; };
if (!Hlp_Is_oCMobContainer (mobPtr2)) { return; };
_MobTransferItem_ToNpcPtr = 0;
_MobTransferItem_Method = MobTransferItem_MoveToMob;
var int i;
var int transferredItem;
var int ptr;
var oCMobContainer container; container = _^ (mobPtr1);
var zCListSort list;
ptr = container.containList_next;
while (ptr != 0);
list = _^ (ptr);
var int itmPtr; itmPtr = list.data;
if (itmPtr == 0) {
ptr = list.next;
} else {
//Custom prints for transferred items
if ((_MobTransferItem_Event) && (_MobTransferItem_Event_Enabled)) {
Event_Execute (_MobTransferItem_Event, itmPtr);
};
oCMobContainer_Insert (mobPtr2, itmPtr);
oCMobContainer_Remove (mobPtr1, itmPtr);
ptr = container.containList_next;
};
end;
};
func void Mob_CopyItemsToMob (var int mobPtr1, var int mobPtr2){
if (!Hlp_Is_oCMobContainer (mobPtr1)) { return; };
if (!Hlp_Is_oCMobContainer (mobPtr2)) { return; };
_MobTransferItem_ToNpcPtr = 0;
_MobTransferItem_Method = MobTransferItem_CopyToMob;
var int i;
var int transferredItem;
var int ptr;
var oCMobContainer container; container = _^ (mobPtr1);
var zCListSort list;
ptr = container.containList_next;
while (ptr != 0);
list = _^ (ptr);
var int itmPtr; itmPtr = list.data;
if (itmPtr) {
//Custom prints for transferred items
if ((_MobTransferItem_Event) && (_MobTransferItem_Event_Enabled)) {
Event_Execute (_MobTransferItem_Event, itmPtr);
};
oCMobContainer_Insert (mobPtr2, itmPtr);
};
ptr = list.next;
end;
};
/*
* Returns -1 mobPtr is either invalid or not oCMobContainer
* 0 mobPtr is not empty
* 1 mobPtr is empty
*/
func int Mob_IsEmpty (var int mobPtr) {
if (!Hlp_Is_oCMobContainer (mobPtr)) { return -1; };
var oCMobContainer container; container = _^ (mobPtr);
if (!container.containList_next) {
return TRUE;
};
return FALSE;
};