@@ -2003,16 +2003,36 @@ static int mob_ai_hard(int tid, unsigned int tick, int id, intptr_t data)
return 0;
}

/**
* Set random option for item when dropped from monster
* @param itm Item data
* @param mobdrop Drop data
* @author [Cydh]
**/
void mob_setdropitem_option(struct item *itm, struct s_mob_drop *mobdrop) {
struct s_random_opt_group *g = NULL;
if (!itm || !mobdrop || mobdrop->randomopt_group == RDMOPTG_None)
return;
if ((g = itemdb_randomopt_group_exists(mobdrop->randomopt_group)) && g->total) {
int r = rnd()%g->total;
if (&g->entries[r]) {
memcpy(&itm->option, &g->entries[r], sizeof(itm->option));
return;
}
}
}

/*==========================================
* Initializes the delay drop structure for mob-dropped items.
*------------------------------------------*/
static struct item_drop* mob_setdropitem(unsigned short nameid, int qty, unsigned short mob_id)
static struct item_drop* mob_setdropitem(struct s_mob_drop *mobdrop, int qty, unsigned short mob_id)
{
struct item_drop *drop = ers_alloc(item_drop_ers, struct item_drop);
memset(&drop->item_data, 0, sizeof(struct item));
drop->item_data.nameid = nameid;
drop->item_data.nameid = mobdrop->nameid;
drop->item_data.amount = qty;
drop->item_data.identify = itemdb_isidentified(nameid);
drop->item_data.identify = itemdb_isidentified(mobdrop->nameid);
mob_setdropitem_option(&drop->item_data, mobdrop);
drop->mob_id = mob_id;
drop->next = NULL;
return drop;
@@ -2589,7 +2609,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
dlist->third_charid = (third_sd ? third_sd->status.char_id : 0);
dlist->item = NULL;

for (i = 0; i < MAX_MOB_DROP; i++) {
for (i = 0; i < MAX_MOB_DROP_TOTAL; i++) {
if (md->db->dropitem[i].nameid <= 0)
continue;
if ( !(it = itemdb_exists(md->db->dropitem[i].nameid)) )
@@ -2660,7 +2680,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
continue;
}

ditem = mob_setdropitem(md->db->dropitem[i].nameid, 1, md->mob_id);
ditem = mob_setdropitem(&md->db->dropitem[i], 1, md->mob_id);

//A Rare Drop Global Announce by Lupus
if( mvp_sd && drop_rate <= battle_config.rare_drop_announce ) {
@@ -2676,7 +2696,10 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)

// Ore Discovery [Celest]
if (sd == mvp_sd && pc_checkskill(sd,BS_FINDINGORE)>0 && battle_config.finding_ore_rate/10 >= rnd()%10000) {
ditem = mob_setdropitem(itemdb_searchrandomid(IG_FINDINGORE,1), 1, md->mob_id);
struct s_mob_drop mobdrop;
memset(&mobdrop, 0, sizeof(struct s_mob_drop));
mobdrop.nameid = itemdb_searchrandomid(IG_FINDINGORE,1);
ditem = mob_setdropitem(&mobdrop, 1, md->mob_id);
mob_item_drop(md, dlist, ditem, 0, battle_config.finding_ore_rate/10, homkillonly);
}

@@ -2685,6 +2708,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
uint16 dropid = 0;

for (i = 0; i < ARRAYLENGTH(sd->add_drop); i++) {
struct s_mob_drop mobdrop;
if (!&sd->add_drop[i] || (!sd->add_drop[i].nameid && !sd->add_drop[i].group))
continue;
if ((sd->add_drop[i].race < RC_NONE_ && sd->add_drop[i].race == -md->mob_id) || //Race < RC_NONE_, use mob_id
@@ -2705,8 +2729,10 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
if (rnd()%10000 >= drop_rate)
continue;
dropid = (sd->add_drop[i].nameid > 0) ? sd->add_drop[i].nameid : itemdb_searchrandomid(sd->add_drop[i].group,1);
memset(&mobdrop, 0, sizeof(struct s_mob_drop));
mobdrop.nameid = dropid;

mob_item_drop(md, dlist, mob_setdropitem(dropid,1,md->mob_id), 0, drop_rate, homkillonly);
mob_item_drop(md, dlist, mob_setdropitem(&mobdrop,1,md->mob_id), 0, drop_rate, homkillonly);
}
}

@@ -2765,47 +2791,37 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)

if( !(map[m].flag.nomvploot || type&1) ) {
//Order might be random depending on item_drop_mvp_mode config setting
int mdrop_id[MAX_MVP_DROP];
int mdrop_p[MAX_MVP_DROP];
struct s_mob_drop mdrop[MAX_MVP_DROP_TOTAL];

memset(mdrop_id,0,MAX_MVP_DROP*sizeof(int));
memset(mdrop_p,0,MAX_MVP_DROP*sizeof(int));
memset(&mdrop,0,sizeof(mdrop));

if(battle_config.item_drop_mvp_mode == 1) {
//Random order
for(i = 0; i < MAX_MVP_DROP; i++) {
for(i = 0; i < MAX_MVP_DROP_TOTAL; i++) {
while( 1 ) {
uint8 va = rnd()%MAX_MVP_DROP;
if (mdrop_id[va] == 0) {
if (md->db->mvpitem[i].nameid > 0) {
mdrop_id[va] = md->db->mvpitem[i].nameid;
mdrop_p[va] = md->db->mvpitem[i].p;
}
else
mdrop_id[va] = -1;
uint8 va = rnd()%MAX_MVP_DROP_TOTAL;
if (mdrop[va].nameid == 0) {
if (md->db->mvpitem[i].nameid > 0)
memcpy(&mdrop[va],&md->db->mvpitem[i],sizeof(mdrop[va]));
break;
}
}
}
} else {
//Normal order
for(i = 0; i < MAX_MVP_DROP; i++) {
if (md->db->mvpitem[i].nameid > 0) {
mdrop_id[i] = md->db->mvpitem[i].nameid;
mdrop_p[i] = md->db->mvpitem[i].p;
}
else
mdrop_id[i] = -1;
for(i = 0; i < MAX_MVP_DROP_TOTAL; i++) {
if (md->db->mvpitem[i].nameid > 0)
memcpy(&mdrop[i],&md->db->mvpitem[i],sizeof(mdrop[i]));
}
}

for(i = 0; i < MAX_MVP_DROP; i++) {
for(i = 0; i < MAX_MVP_DROP_TOTAL; i++) {
struct item_data *i_data;

if(mdrop_id[i] <= 0 || !itemdb_exists(mdrop_id[i]))
if(mdrop[i].nameid <= 0 || !(i_data = itemdb_exists(mdrop[i].nameid)))
continue;

temp = mdrop_p[i];
temp = mdrop[i].p;
if (temp != 10000) {
if(temp <= 0 && !battle_config.drop_rate0item)
temp = 1;
@@ -2814,13 +2830,11 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
}

memset(&item,0,sizeof(item));
item.nameid=mdrop_id[i];
item.nameid=mdrop[i].nameid;
item.identify= itemdb_isidentified(item.nameid);
clif_mvp_item(mvp_sd,item.nameid);
log_mvp[0] = item.nameid;

i_data = itemdb_exists(item.nameid);

//A Rare MVP Drop Global Announce by Lupus
if(temp<=battle_config.rare_drop_announce) {
char message[128];
@@ -2829,6 +2843,8 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
intif_broadcast(message,strlen(message)+1,BC_DEFAULT);
}

mob_setdropitem_option(&item, &mdrop[i]);

if((temp = pc_additem(mvp_sd,&item,1,LOG_TYPE_PICKDROP_PLAYER)) != 0) {
clif_additem(mvp_sd,0,0,temp);
map_addflooritem(&item,1,mvp_sd->bl.m,mvp_sd->bl.x,mvp_sd->bl.y,mvp_sd->status.char_id,(second_sd?second_sd->status.char_id:0),(third_sd?third_sd->status.char_id:0),1,0);
@@ -4752,6 +4768,81 @@ static bool mob_readdb_itemratio(char* str[], int columns, int current)
return true;
}

/**
* Read additional monster drop from db file
* @author [Cydh]
**/
static bool mob_readdb_drop(char* str[], int columns, int current) {
unsigned short mobid, nameid;
int rate, i, size, flag = 0;
struct mob_db *mob;
struct s_mob_drop *drop;

mobid = atoi(str[0]);
if ((mob = mob_db(mobid)) == mob_dummy) {
ShowError("mob_readdb_drop: Invalid monster with ID %s.\n", str[0]);
return false;
}

nameid = atoi(str[1]);
if (itemdb_exists(nameid) == NULL) {
ShowWarning("mob_readdb_drop: Invalid item id %s.\n", str[1]);
return false;
}

rate = atoi(str[2]);
if (columns > 4 && (flag = atoi(str[4])) == 2) {
drop = mob->mvpitem;
size = ARRAYLENGTH(mob->mvpitem);
}
else {
drop = mob->dropitem;
size = ARRAYLENGTH(mob->dropitem);
}

if (rate == 0) {
for (i = 0; i < size; i++) {
if (drop[i].nameid == nameid) {
memset(&drop[i], 0, sizeof(struct s_mob_drop));
ShowInfo("mob_readdb_drop: Removed item '%hu' from monster '%hu'.\n", nameid, mobid);
return true;
}
}
}
else {
for (i = 0; i < size; i++) {
if (drop[i].nameid == 0)
break;
}
if (i == size) {
ShowError("mob_readdb_drop: Cannot add item '%hu' to monster '%hu'. Max drop reached '%d'.\n", nameid, mobid, size);
return true;
}

drop[i].nameid = nameid;
drop[i].p = rate;
drop[i].steal_protected = (flag) ? 1 : 0;
drop[i].randomopt_group = 0;

if (columns > 3) {
int randomopt_group = -1;
if (!script_get_constant(trim(str[3]), &randomopt_group)) {
ShowError("mob_readdb_drop: Invalid 'randopt_groupid' '%s' for monster '%hu'.\n", str[3], mobid);
return false;
}
if (randomopt_group == RDMOPTG_None)
return true;
if (!itemdb_randomopt_group_exists(randomopt_group)) {
ShowError("mob_readdb_drop: 'randopt_groupid' '%s' cannot be found in DB for monster '%hu'.\n", str[3], mobid);
return false;
}
drop[i].randomopt_group = randomopt_group;
}
}

return true;
}

/**
* Free drop ratio data
**/
@@ -4782,7 +4873,7 @@ static void mob_drop_ratio_adjust(void){

mob_id = i;

for( j = 0; j < MAX_MVP_DROP; j++ ){
for( j = 0; j < MAX_MVP_DROP_TOTAL; j++ ){
nameid = mob->mvpitem[j].nameid;
rate = mob->mvpitem[j].p;

@@ -4819,7 +4910,7 @@ static void mob_drop_ratio_adjust(void){
mob->mvpitem[j].p = rate;
}

for( j = 0; j < MAX_MOB_DROP; j++ ){
for( j = 0; j < MAX_MOB_DROP_TOTAL; j++ ){
unsigned short ratemin, ratemax;
bool is_treasurechest;

@@ -5084,6 +5175,7 @@ static void mob_load(void)
sv_readdb(dbsubpath2, "mob_boss.txt", ',', 4, 4, -1, &mob_readdb_group, i );
sv_readdb(dbsubpath1, "mob_pouch.txt", ',', 4, 4, -1, &mob_readdb_group, i );
sv_readdb(dbsubpath1, "mob_classchange.txt", ',', 4, 4, -1, &mob_readdb_group, i );
sv_readdb(dbsubpath2, "mob_drop.txt", ',', 3, 5, -1, &mob_readdb_drop, i );

aFree(dbsubpath1);
aFree(dbsubpath2);
@@ -19,6 +19,10 @@
//The number of drops all mobs have and the max drop-slot that the steal skill will attempt to steal from.
#define MAX_MOB_DROP 10
#define MAX_MVP_DROP 3
#define MAX_MOB_DROP_ADD 5
#define MAX_MVP_DROP_ADD 2
#define MAX_MOB_DROP_TOTAL (MAX_MOB_DROP+MAX_MOB_DROP_ADD)
#define MAX_MVP_DROP_TOTAL (MAX_MVP_DROP+MAX_MVP_DROP_ADD)
#define MAX_STEAL_DROP 7

#define MAX_RACE2_MOBS 100
@@ -137,21 +141,22 @@ struct s_mob_lootitem {
unsigned short mob_id; ///< ID of monster that dropped the item
};

/// Struct for monster's drop item
struct s_mob_drop {
unsigned short nameid;
int p;
uint8 randomopt_group;
unsigned steal_protected : 1;
};

struct mob_db {
char sprite[NAME_LENGTH],name[NAME_LENGTH],jname[NAME_LENGTH];
unsigned int base_exp,job_exp;
unsigned int mexp;
short range2,range3;
enum e_race2 race2; // celest
unsigned short lv;
struct {
unsigned short nameid;
int p;
} dropitem[MAX_MOB_DROP];
struct {
unsigned short nameid;
int p;
} mvpitem[MAX_MVP_DROP];
struct s_mob_drop dropitem[MAX_MOB_DROP_TOTAL], mvpitem[MAX_MVP_DROP_TOTAL];
struct status_data status;
struct view_data vd;
unsigned int option;
@@ -355,6 +360,8 @@ int mvptomb_delayspawn(int tid, unsigned int tick, int id, intptr_t data);
void mvptomb_create(struct mob_data *md, char *killer, time_t time);
void mvptomb_destroy(struct mob_data *md);

void mob_setdropitem_option(struct item *itm, struct s_mob_drop *mobdrop);

#define CHK_MOBSIZE(size) ((size) >= SZ_SMALL && (size) < SZ_MAX) /// Check valid Monster Size

#endif /* _MOB_H_ */
@@ -5252,7 +5252,7 @@ int pc_steal_item(struct map_session_data *sd,struct block_list *bl, uint16 skil
// Try dropping one item, in the order from first to last possible slot.
// Droprate is affected by the skill success rate.
for( i = 0; i < MAX_STEAL_DROP; i++ )
if( md->db->dropitem[i].nameid > 0 && itemdb_exists(md->db->dropitem[i].nameid) && rnd() % 10000 < md->db->dropitem[i].p * rate/100. )
if( md->db->dropitem[i].nameid > 0 && !md->db->dropitem[i].steal_protected && itemdb_exists(md->db->dropitem[i].nameid) && rnd() % 10000 < md->db->dropitem[i].p * rate/100. )
break;
if( i == MAX_STEAL_DROP )
return 0;
@@ -5262,6 +5262,7 @@ int pc_steal_item(struct map_session_data *sd,struct block_list *bl, uint16 skil
tmp_item.nameid = itemid;
tmp_item.amount = 1;
tmp_item.identify = itemdb_isidentified(itemid);
mob_setdropitem_option(&tmp_item, &md->db->dropitem[i]);
flag = pc_additem(sd,&tmp_item,1,LOG_TYPE_PICKDROP_PLAYER);

//TODO: Should we disable stealing when the item you stole couldn't be added to your inventory? Perhaps players will figure out a way to exploit this behaviour otherwise?
@@ -10033,7 +10033,7 @@ BUILDIN_FUNC(getmobdrops)

mob = mob_db(class_);

for( i = 0; i < MAX_MOB_DROP; i++ )
for( i = 0; i < MAX_MOB_DROP_TOTAL; i++ )
{
if( mob->dropitem[i].nameid < 1 )
continue;
@@ -16734,7 +16734,7 @@ BUILDIN_FUNC(addmonsterdrop)

if(mob) { //We got a valid monster, check for available drop slot
unsigned char i, c = 0;
for(i = 0; i < MAX_MOB_DROP; i++) {
for(i = 0; i < MAX_MOB_DROP_TOTAL; i++) {
if(mob->dropitem[i].nameid) {
if(mob->dropitem[i].nameid == item_id) { //If it equals item_id we update that drop
c = i;
@@ -16790,7 +16790,7 @@ BUILDIN_FUNC(delmonsterdrop)

if(mob) { //We got a valid monster, check for item drop on monster
unsigned char i;
for(i = 0; i < MAX_MOB_DROP; i++) {
for(i = 0; i < MAX_MOB_DROP_TOTAL; i++) {
if(mob->dropitem[i].nameid == item_id) {
mob->dropitem[i].nameid = 0;
mob->dropitem[i].p = 0;
@@ -3222,6 +3222,10 @@
export_constant(MOBG_Red_Pouch_Of_Surprise);
export_constant(MOBG_ClassChange);

/* Item Random Option Group */
export_constant(RDMOPTG_None);
export_constant(RDMOPTG_Crimson_Weapon);

/* random option attributes */
export_constant(ROA_ID);
export_constant(ROA_VALUE);
@@ -323,6 +323,7 @@
<Copy SourceFiles="..\db\import-tmpl\item_stack.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_stack.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_trade.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_trade.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_randomopt_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_randomopt_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_randomopt_group.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_randomopt_group.txt')" />
<Copy SourceFiles="..\db\import-tmpl\job_basehpsp_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\job_basehpsp_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\job_db1.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\job_db1.txt')" />
<Copy SourceFiles="..\db\import-tmpl\job_db2.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\job_db2.txt')" />
@@ -338,6 +339,7 @@
<Copy SourceFiles="..\db\import-tmpl\mob_avail.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_avail.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_chat_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_chat_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_drop.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_drop.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_item_ratio.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_item_ratio.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_race2_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_race2_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_random_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_random_db.txt')" />
@@ -327,6 +327,7 @@
<Copy SourceFiles="..\db\import-tmpl\item_stack.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_stack.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_trade.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_trade.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_randomopt_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_randomopt_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_randomopt_group.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_randomopt_group.txt')" />
<Copy SourceFiles="..\db\import-tmpl\job_basehpsp_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\job_basehpsp_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\job_db1.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\job_db1.txt')" />
<Copy SourceFiles="..\db\import-tmpl\job_db2.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\job_db2.txt')" />
@@ -342,6 +343,7 @@
<Copy SourceFiles="..\db\import-tmpl\mob_avail.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_avail.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_chat_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_chat_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_drop.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_drop.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_item_ratio.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_item_ratio.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_race2_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_race2_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_random_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_random_db.txt')" />
@@ -327,6 +327,7 @@
<Copy SourceFiles="..\db\import-tmpl\item_stack.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_stack.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_trade.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_trade.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_randomopt_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_randomopt_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_randomopt_group.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_randomopt_group.txt')" />
<Copy SourceFiles="..\db\import-tmpl\job_basehpsp_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\job_basehpsp_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\job_db1.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\job_db1.txt')" />
<Copy SourceFiles="..\db\import-tmpl\job_db2.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\job_db2.txt')" />
@@ -342,6 +343,7 @@
<Copy SourceFiles="..\db\import-tmpl\mob_avail.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_avail.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_chat_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_chat_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_drop.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_drop.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_item_ratio.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_item_ratio.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_race2_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_race2_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_random_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_random_db.txt')" />
@@ -325,6 +325,7 @@
<Copy SourceFiles="..\db\import-tmpl\item_stack.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_stack.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_trade.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_trade.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_randomopt_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_randomopt_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\item_randomopt_group.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\item_randomopt_group.txt')" />
<Copy SourceFiles="..\db\import-tmpl\job_basehpsp_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\job_basehpsp_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\job_db1.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\job_db1.txt')" />
<Copy SourceFiles="..\db\import-tmpl\job_db2.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\job_db2.txt')" />
@@ -340,6 +341,7 @@
<Copy SourceFiles="..\db\import-tmpl\mob_avail.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_avail.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_chat_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_chat_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_drop.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_drop.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_item_ratio.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_item_ratio.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_race2_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_race2_db.txt')" />
<Copy SourceFiles="..\db\import-tmpl\mob_random_db.txt" DestinationFolder="..\db\import\" ContinueOnError="true" Condition="!Exists('..\db\import\mob_random_db.txt')" />