@@ -12284,36 +12284,87 @@ static BUILDIN(monster)
12284
12284
*------------------------------------------*/
12285
12285
static BUILDIN(getmobdrops)
12286
12286
{
12287
- int class_ = script_getnum(st,2);
12288
- int i, j = 0;
12289
- struct mob_db *monster;
12287
+ struct map_session_data *sd = NULL;
12288
+ int mob_id = script_getnum(st, 2);
12289
+ struct mob_db *monster = NULL;
12290
+ struct script_data *data1 = script_getdata(st, 3);
12291
+ struct script_data *data2 = NULL;
12292
+ const char *varname1 = NULL;
12293
+ const char *varname2 = NULL;
12294
+ int varid1 = 0;
12295
+ int varid2 = 0;
12296
+ int num = 0;
12290
12297
12291
- if( !mob->db_checkid(class_) )
12292
- {
12298
+ if (!data_isreference(data1) || reference_toconstant(data1)) {
12299
+ ShowError("buildin_getmobdrops: Target argument must be a variable\n");
12300
+ script->reportdata(data1);
12301
+ st->state = END;
12302
+ return false;
12303
+ }
12304
+
12305
+ varname1 = reference_getname(data1);
12306
+ varid1 = reference_getid(data1);
12307
+
12308
+ if (!is_int_variable(varname1)) {
12309
+ ShowError("buildin_getmobdrops: Target argument must be an integer variable\n");
12310
+ script->reportdata(data1);
12311
+ st->state = END;
12312
+ return false;
12313
+ }
12314
+
12315
+ if (script_hasdata(st, 4)) {
12316
+ data2 = script_getdata(st, 4);
12317
+
12318
+ if (!data_isreference(data2) || reference_toconstant(data2)) {
12319
+ ShowError("buildin_getmobdrops: Target argument must be a variable\n");
12320
+ script->reportdata(data1);
12321
+ st->state = END;
12322
+ return false;
12323
+ }
12324
+
12325
+ varname2 = reference_getname(data2);
12326
+ varid2 = reference_getid(data2);
12327
+
12328
+ if (data2 == NULL || !is_int_variable(varname2)) {
12329
+ ShowError("buildin_getmobdrops: 2nd target argument must be an integer variable\n");
12330
+ script->reportdata(data2);
12331
+ st->state = END;
12332
+ return false;
12333
+ }
12334
+ }
12335
+
12336
+ if (not_server_variable(*varname1) || (data2 != NULL && not_server_variable(*varname2))) {
12337
+ sd = script->rid2sd(st);
12338
+ if (sd == NULL) {
12339
+ script_pushint(st, 0);
12340
+ return true; // player variable but no player attached
12341
+ }
12342
+ }
12343
+
12344
+ monster = mob->db(mob_id);
12345
+
12346
+ if (!mob->db_checkid(mob_id) || monster == NULL) {
12293
12347
script_pushint(st, 0);
12294
12348
return true;
12295
12349
}
12296
12350
12297
- monster = mob->db(class_);
12298
-
12299
- for( i = 0; i < MAX_MOB_DROP; i++ )
12300
- {
12301
- if( monster->dropitem[i].nameid < 1 )
12351
+ for (int i = 0; i < MAX_MOB_DROP; i++) {
12352
+ if (monster->dropitem[i].nameid < 1)
12302
12353
continue;
12303
- if( itemdb->exists(monster->dropitem[i].nameid) == NULL )
12354
+ if ( itemdb->exists(monster->dropitem[i].nameid) == NULL)
12304
12355
continue;
12305
12356
12306
- mapreg->setreg( reference_uid(script->add_variable("$@MobDrop_item"), j ), monster->dropitem[i].nameid);
12307
- mapreg->setreg(reference_uid(script->add_variable("$@MobDrop_rate"), j), monster->dropitem[i].p);
12308
-
12309
- j ++;
12357
+ script->set_reg(st, sd, reference_uid(varid1, num ), varname1, (const void *)h64BPTRSIZE( monster->dropitem[i].nameid), reference_getref(data1) );
12358
+ if (data2 != NULL)
12359
+ script->set_reg(st, sd, reference_uid(varid2, num), varname2, (const void *)h64BPTRSIZE(monster->dropitem[i].p), reference_getref(data2));
12360
+ num ++;
12310
12361
}
12311
12362
12312
- mapreg->setreg(script->add_variable("$@MobDrop_count"), j);
12313
- script_pushint(st, 1);
12363
+ script_pushint(st, num);
12314
12364
12315
12365
return true;
12316
12366
}
12367
+
12317
12368
/*==========================================
12318
12369
* Same as monster but randomize location in x0,x1,y0,y1 area
12319
12370
*------------------------------------------*/
@@ -29110,7 +29161,7 @@ static void script_parse_builtin(void)
29110
29161
BUILDIN_DEF(produce,"i"),
29111
29162
BUILDIN_DEF(cooking,"i"),
29112
29163
BUILDIN_DEF(monster,"siisii???"),
29113
- BUILDIN_DEF(getmobdrops,"i "),
29164
+ BUILDIN_DEF(getmobdrops,"ii? "),
29114
29165
BUILDIN_DEF(areamonster,"siiiisii???"),
29115
29166
BUILDIN_DEF(killmonster,"ss?"),
29116
29167
BUILDIN_DEF(killmonsterall,"s?"),
0 commit comments