summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/map/itemdb.h39
-rw-r--r--src/map/map.h42
-rw-r--r--src/map/pc.c16
-rw-r--r--src/map/pc.h2
-rw-r--r--src/map/script.c7
-rw-r--r--src/map/unit.c1
6 files changed, 57 insertions, 50 deletions
diff --git a/src/map/itemdb.h b/src/map/itemdb.h
index 5c7ef4240..fd3c5191f 100644
--- a/src/map/itemdb.h
+++ b/src/map/itemdb.h
@@ -59,45 +59,6 @@ struct item_group {
int id[30]; // 120 bytes
};
-enum {
- IG_BLUEBOX=1,
- IG_VIOLETBOX, //2
- IG_CARDALBUM, //3
- IG_GIFTBOX, //4
- IG_SCROLLBOX, //5
- IG_FINDINGORE, //6
- IG_COOKIEBAG, //7
- IG_POTION, //8
- IG_HERBS, //9
- IG_FRUITS, //10
- IG_MEAT, //11
- IG_CANDY, //12
- IG_JUICE, //13
- IG_FISH, //14
- IG_BOXES, //15
- IG_GEMSTONE, //16
- IG_JELLOPY, //17
- IG_ORE, //18
- IG_FOOD, //19
- IG_RECOVERY, //20
- IG_MINERALS, //21
- IG_TAMING, //22
- IG_SCROLLS, //23
- IG_QUIVERS, //24
- IG_MASKS, //25
- IG_ACCESORY, //26
- IG_JEWELS, //27
- IG_GIFTBOX_1, //28
- IG_GIFTBOX_2, //29
- IG_GIFTBOX_3, //30
- IG_GIFTBOX_4, //31
- IG_EGGBOY, //32
- IG_EGGGIRL, //33
- IG_GIFTBOXCHINA, //34
- IG_LOTTOBOX, //35
- MAX_ITEMGROUP,
-} item_group_list;
-
struct item_data* itemdb_searchname(const char *name);
int itemdb_searchname_array(struct item_data** data, int size, const char *str);
struct item_data* itemdb_load(int nameid);
diff --git a/src/map/map.h b/src/map/map.h
index 7a8b99f33..da8b1c715 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -216,6 +216,46 @@ enum {
ELE_MAX
};
+enum {
+ IG_BLUEBOX=1,
+ IG_VIOLETBOX, //2
+ IG_CARDALBUM, //3
+ IG_GIFTBOX, //4
+ IG_SCROLLBOX, //5
+ IG_FINDINGORE, //6
+ IG_COOKIEBAG, //7
+ IG_POTION, //8
+ IG_HERBS, //9
+ IG_FRUITS, //10
+ IG_MEAT, //11
+ IG_CANDY, //12
+ IG_JUICE, //13
+ IG_FISH, //14
+ IG_BOXES, //15
+ IG_GEMSTONE, //16
+ IG_JELLOPY, //17
+ IG_ORE, //18
+ IG_FOOD, //19
+ IG_RECOVERY, //20
+ IG_MINERALS, //21
+ IG_TAMING, //22
+ IG_SCROLLS, //23
+ IG_QUIVERS, //24
+ IG_MASKS, //25
+ IG_ACCESORY, //26
+ IG_JEWELS, //27
+ IG_GIFTBOX_1, //28
+ IG_GIFTBOX_2, //29
+ IG_GIFTBOX_3, //30
+ IG_GIFTBOX_4, //31
+ IG_EGGBOY, //32
+ IG_EGGGIRL, //33
+ IG_GIFTBOXCHINA, //34
+ IG_LOTTOBOX, //35
+ MAX_ITEMGROUP,
+} item_group_list;
+
+
struct block_list {
struct block_list *next,*prev;
int id;
@@ -587,7 +627,7 @@ struct map_session_data {
int magic_addsize[3];
int critaddrace[RC_MAX];
int expaddrace[RC_MAX];
- int itemhealrate[7];
+ int itemhealrate[MAX_ITEMGROUP];
int addeff3[SC_COMMON_MAX-SC_COMMON_MIN+1];
short addeff3_type[SC_COMMON_MAX-SC_COMMON_MIN+1];
short sp_gain_race[RC_MAX];
diff --git a/src/map/pc.c b/src/map/pc.c
index 4f153252e..606d85f88 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -2131,8 +2131,12 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
sd->subrace2[type2]+=val;
break;
case SP_ADD_ITEM_HEAL_RATE:
- if(sd->state.lr_flag != 2)
- sd->itemhealrate[type2 - 1] += val;
+ if(sd->state.lr_flag == 2)
+ break;
+ if (type2 < MAX_ITEMGROUP)
+ sd->itemhealrate[type2] += val;
+ else
+ ShowWarning("pc_bonus2: AddItemHealRate: Group %d is beyond limit (%d).\n", type2, MAX_ITEMGROUP);
break;
case SP_EXP_ADDRACE:
if(sd->state.lr_flag != 2)
@@ -5225,20 +5229,18 @@ void pc_heal(struct map_session_data *sd,unsigned int hp,unsigned int sp, int ty
* HP/SP‰ñ•œ
*------------------------------------------
*/
-int pc_itemheal(struct map_session_data *sd,int hp,int sp)
+int pc_itemheal(struct map_session_data *sd,int itemid, int hp,int sp)
{
int bonus, type;
- nullpo_retr(0, sd);
-
if(hp) {
bonus = 100 + (sd->battle_status.vit<<1)
+ pc_checkskill(sd,SM_RECOVERY)*10
+ pc_checkskill(sd,AM_LEARNINGPOTION)*5;
// A potion produced by an Alchemist in the Fame Top 10 gets +50% effect [DracoRPG]
bonus += (potion_flag==2)?50:(potion_flag==3?100:0);
- if ((type = itemdb_group(sd->itemid)) > 0 && type <= 7)
- bonus = bonus * (100+sd->itemhealrate[type - 1]) / 100;
+ if ((type = itemdb_group(itemid)) > 0 && type < MAX_ITEMGROUP && sd->itemhealrate[type])
+ bonus += bonus * sd->itemhealrate[type] / 100;
if(bonus!=100)
hp = hp * bonus / 100;
}
diff --git a/src/map/pc.h b/src/map/pc.h
index 47dd0b4aa..94613d114 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -156,7 +156,7 @@ void pc_damage(struct map_session_data *sd,struct block_list *src,unsigned int h
int pc_dead(struct map_session_data *sd,struct block_list *src);
void pc_revive(struct map_session_data *sd,unsigned int hp, unsigned int sp);
void pc_heal(struct map_session_data *sd,unsigned int hp,unsigned int sp, int type);
-int pc_itemheal(struct map_session_data *sd,int hp,int sp);
+int pc_itemheal(struct map_session_data *sd,int itemid, int hp,int sp);
int pc_percentheal(struct map_session_data *sd,int,int);
int pc_jobchange(struct map_session_data *,int, int);
int pc_setoption(struct map_session_data *,int);
diff --git a/src/map/script.c b/src/map/script.c
index 21fe6dab5..c442f210f 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -3343,6 +3343,7 @@ int buildin_heal(struct script_state *st)
*/
int buildin_itemheal(struct script_state *st)
{
+ struct map_session_data *sd;
int hp,sp;
hp=conv_num(st,& (st->stack->stack_data[st->start+2]));
@@ -3353,8 +3354,10 @@ int buildin_itemheal(struct script_state *st)
potion_sp = sp;
return 0;
}
-
- pc_itemheal(script_rid2sd(st),hp,sp);
+
+ sd = script_rid2sd(st);
+ if (!sd) return 0;
+ pc_itemheal(sd,sd->itemid,hp,sp);
return 0;
}
/*==========================================
diff --git a/src/map/unit.c b/src/map/unit.c
index 5137d5f71..304160fe8 100644
--- a/src/map/unit.c
+++ b/src/map/unit.c
@@ -1658,6 +1658,7 @@ int unit_free(struct block_list *bl) {
}
if (pd->loot)
{
+ pet_lootitem_drop(pd,sd);
if (pd->loot->item)
aFree(pd->loot->item);
aFree (pd->loot);