@@ -12284,36 +12284,87 @@ static BUILDIN(monster)
1228412284 *------------------------------------------*/
1228512285static BUILDIN(getmobdrops)
1228612286{
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;
1229012297
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) {
1229312347 script_pushint(st, 0);
1229412348 return true;
1229512349 }
1229612350
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)
1230212353 continue;
12303- if( itemdb->exists(monster->dropitem[i].nameid) == NULL )
12354+ if ( itemdb->exists(monster->dropitem[i].nameid) == NULL)
1230412355 continue;
1230512356
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 ++;
1231012361 }
1231112362
12312- mapreg->setreg(script->add_variable("$@MobDrop_count"), j);
12313- script_pushint(st, 1);
12363+ script_pushint(st, num);
1231412364
1231512365 return true;
1231612366}
12367+
1231712368/*==========================================
1231812369 * Same as monster but randomize location in x0,x1,y0,y1 area
1231912370 *------------------------------------------*/
@@ -29110,7 +29161,7 @@ static void script_parse_builtin(void)
2911029161 BUILDIN_DEF(produce,"i"),
2911129162 BUILDIN_DEF(cooking,"i"),
2911229163 BUILDIN_DEF(monster,"siisii???"),
29113- BUILDIN_DEF(getmobdrops,"i "),
29164+ BUILDIN_DEF(getmobdrops,"ii? "),
2911429165 BUILDIN_DEF(areamonster,"siiiisii???"),
2911529166 BUILDIN_DEF(killmonster,"ss?"),
2911629167 BUILDIN_DEF(killmonsterall,"s?"),
0 commit comments