Index: src/map/script.c
===================================================================
--- src/map/script.c (revision 17337)
+++ src/map/script.c (working copy)
@@ -9839,7 +9839,7 @@
TBL_NPC * nd = map_id2nd(st->oid);
struct block_list* bl;
enum sc_type type;
- int tick, val1, val2, val3, val4=0, rate, flag, isitem;
+ int tick, val1, val2, val3, val4=0, rate, flag;
char start_type;
const char* command = script_getfuncname(st);
@@ -9854,8 +9854,11 @@
tick = script_getnum(st,3);
val1 = script_getnum(st,4);
+ //solving if script from npc or item
+ flag = (nd && nd->bl.id == fake_nd->bl.id)?0:16;
+
rate = script_hasdata(st,4+start_type)?min(script_getnum(st,4+start_type),10000):10000;
- flag = script_hasdata(st,5+start_type)?script_getnum(st,5+start_type):2;
+ flag += script_hasdata(st,5+start_type)?script_getnum(st,5+start_type):flag?0:2;
if(script_hasdata(st,(6+start_type)))
bl = map_id2bl(script_getnum(st,(6+start_type)));
@@ -9873,25 +9876,22 @@
val4 = 1;// Mark that this was a thrown sc_effect
}
- //solving if script from npc or item
- isitem = (nd && nd->bl.id == fake_nd->bl.id || flag != 2)?true:false;
-
switch(start_type) {
case 1:
if(bl)
- status_change_start(isitem?bl:NULL, bl, type, rate, val1, 0, 0, val4, tick, flag);
+ status_change_start(bl, bl, type, rate, val1, 0, 0, val4, tick, flag);
break;
case 2:
val2 = script_getnum(st,5);
if(bl)
- status_change_start(isitem?bl:NULL, bl, type, rate, val1, val2, 0, val4, tick, flag);
+ status_change_start(bl, bl, type, rate, val1, val2, 0, val4, tick, flag);
break;
case 4:
val2 = script_getnum(st,5);
val3 = script_getnum(st,6);
val4 = script_getnum(st,7);
if(bl)
- status_change_start(isitem?bl:NULL, bl, type, rate, val1, val2, val3, val4, tick, flag);
+ status_change_start(bl, bl, type, rate, val1, val2, val3, val4, tick, flag);
break;
}
Index: src/map/status.c
===================================================================
--- src/map/status.c (revision 17337)
+++ src/map/status.c (working copy)
@@ -6259,7 +6259,7 @@
struct map_session_data *sd;
nullpo_ret(bl);
- if(src==NULL) return tick?tick:1;//If no source, it can't be resisted (NPC given)
+ if(src==NULL) return tick?tick:1; //This should not happen in current implementation, but leave it anyway
//Status that are blocked by Golden Thief Bug card or Wand of Hermod
if (status_isimmune(bl))
@@ -6550,6 +6550,7 @@
* &2: Tick should not be reduced (by vit, luk, lv, etc)
* &4: sc_data loaded, no value has to be altered.
* &8: rate should not be reduced
+ * 16: Function called by NPC (no other flag given)
*------------------------------------------*/
int status_change_start(struct block_list* src, struct block_list* bl,enum sc_type type,int rate,int val1,int val2,int val3,int val4,int tick,int flag)
{
@@ -6642,8 +6643,7 @@
sd = BL_CAST(BL_PC, bl);
//Adjust tick according to status resistances
- if( !(flag&(1|4)) )
- {
+ if( !(flag&(1|4) && !(flag == 16)) ) {
tick = status_get_sc_def(src, bl, type, rate, tick, flag);
if( !tick ) return 0;
}