diff options
Diffstat (limited to 'src/map')
-rw-r--r-- | src/map/battle.c | 2 | ||||
-rw-r--r-- | src/map/mob.c | 5 | ||||
-rw-r--r-- | src/map/mob.h | 7 | ||||
-rw-r--r-- | src/map/pet.c | 2 | ||||
-rw-r--r-- | src/map/skill.c | 16 | ||||
-rw-r--r-- | src/map/status.c | 68 |
6 files changed, 49 insertions, 51 deletions
diff --git a/src/map/battle.c b/src/map/battle.c index 58d9a216a..935bc52b9 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -2340,7 +2340,7 @@ struct Damage battle_calc_magic_attack( { if (i > 100) i = 100; mdef -= mdef * i/100; - mdef2-= mdef2* i/100; + //mdef2-= mdef2* i/100; } } if(battle_config.magic_defense_type) diff --git a/src/map/mob.c b/src/map/mob.c index f8be3806b..bfa22fe4a 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -3239,6 +3239,11 @@ static bool mob_parse_dbrow(char** str) return false; } + if (class_ >= MOB_CLONE_START && class_ < MOB_CLONE_END) { + ShowWarning("Mob with ID: %d not loaded. That ID is reserved for player clones. Please increase MAX_MOB_DB (%d)\n", MAX_MOB_DB); + return false; + } + if (mob_db_data[class_] == NULL) mob_db_data[class_] = aCalloc(1, sizeof (struct mob_data)); diff --git a/src/map/mob.h b/src/map/mob.h index ec4d58432..a3b589964 100644 --- a/src/map/mob.h +++ b/src/map/mob.h @@ -13,7 +13,8 @@ // Change this to increase the table size in your mob_db to accomodate a larger mob database. // Be sure to note that IDs 4001 to 4048 are reserved for advanced/baby/expanded classes. -#define MAX_MOB_DB 10000 +// Notice that the last 1000 entries are used for player clones, so always set this to desired value +1000 +#define MAX_MOB_DB 3000 //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 @@ -28,8 +29,8 @@ #define MOB_SLAVEDISTANCE 2 // These define the range of available IDs for clones. [Valaris] -#define MOB_CLONE_START 9001 -#define MOB_CLONE_END 10000 +#define MOB_CLONE_START (MAX_MOB_DB-999) +#define MOB_CLONE_END MAX_MOB_DB // Scripted Mob AI Constants #define CALLBACK_NPCCLICK 0x100 diff --git a/src/map/pet.c b/src/map/pet.c index f66492799..ac369bff5 100644 --- a/src/map/pet.c +++ b/src/map/pet.c @@ -215,7 +215,7 @@ int pet_sc_check(struct map_session_data *sd, int type) if( pd == NULL || (battle_config.pet_equip_required && pd->pet.equip == 0) - || pd->recovery == NULL + || pd->recovery == NULL || pd->recovery->timer != -1 || pd->recovery->type != type ) return 1; diff --git a/src/map/skill.c b/src/map/skill.c index 173de5c0b..50df5e138 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -3417,7 +3417,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in struct status_change *tsc; struct mob_data *md = NULL; struct mob_data *dstmd = NULL; - int i,type=-1; + int i,type; if(skillid > 0 && skilllv <= 0) return 0; // celest @@ -3445,16 +3445,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in return 1; if(status_isdead(src)) return 1; + if(src!=bl && status_isdead(bl) && skillid != ALL_RESURRECTION && skillid != PR_REDEMPTIO) return 1; tstatus = status_get_status_data(bl); sstatus = status_get_status_data(src); - if(src!=bl && (i = skill_get_pl(skillid, skilllv)) > ELE_NEUTRAL && - battle_attr_fix(NULL, NULL, 100, i, tstatus->def_ele, tstatus->ele_lv) <= 0) - return 1; //Skills with an element should be blocked if the target element absorbs it. - //Check for undead skills that convert a no-damage skill into a damage one. [Skotlex] switch (skillid) { case HLIF_HEAL: //[orn] @@ -3483,11 +3480,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in return skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0); } - if (skillid > 0) - type = SkillStatusChangeTable(skillid); - + type = SkillStatusChangeTable(skillid); tsc = status_get_sc(bl); + if (src!=bl && type > -1 && + (i = skill_get_pl(skillid, skilllv)) > ELE_NEUTRAL && + battle_attr_fix(NULL, NULL, 100, i, tstatus->def_ele, tstatus->ele_lv) <= 0) + return 1; //Skills that cause an status should be blocked if the target element blocks its element. + map_freeblock_lock(); switch(skillid) { diff --git a/src/map/status.c b/src/map/status.c index b5f0dbfe8..af3deca33 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -5900,18 +5900,18 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val case SC_SPEARQUICKEN: case SC_CONCENTRATION: sc->opt3 |= 0x1; - opt_flag = 2; + opt_flag = 0; break; case SC_MAXOVERTHRUST: case SC_OVERTHRUST: case SC_SWOO: //Why does it shares the same opt as Overthrust? Perhaps we'll never know... sc->opt3 |= 0x2; - opt_flag = 2; + opt_flag = 0; break; case SC_ENERGYCOAT: case SC_SKE: sc->opt3 |= 0x4; - opt_flag = 2; + opt_flag = 0; break; case SC_INCATKRATE: //Simulate Explosion Spirits effect for NPC_POWERUP [Skotlex] @@ -5921,39 +5921,39 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val } case SC_EXPLOSIONSPIRITS: sc->opt3 |= 0x8; - opt_flag = 2; + opt_flag = 0; break; case SC_STEELBODY: case SC_SKA: sc->opt3 |= 0x10; - opt_flag = 2; + opt_flag = 0; break; case SC_BLADESTOP: sc->opt3 |= 0x20; - opt_flag = 2; + opt_flag = 0; break; //0x40 missing? case SC_BERSERK: sc->opt3 |= 0x80; - opt_flag = 2; + opt_flag = 0; break; //0x100, 0x200 missing? case SC_MARIONETTE: case SC_MARIONETTE2: sc->opt3 |= 0x400; - opt_flag = 2; + opt_flag = 0; break; case SC_ASSUMPTIO: sc->opt3 |= 0x800; - opt_flag = 2; + opt_flag = 0; break; case SC_WARM: //SG skills [Komurka] sc->opt3 |= 0x1000; - opt_flag = 2; + opt_flag = 0; break; case SC_KAITE: sc->opt3 |= 0x2000; - opt_flag = 2; + opt_flag = 0; break; //OPTION case SC_HIDING: @@ -5989,12 +5989,8 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val //On Aegis, when turning on a status change, first goes the option packet, // then the sc packet. - if(opt_flag) { - if (opt_flag == 2) - clif_changeoption2(bl); - else - clif_changeoption(bl); - } + if(opt_flag) + clif_changeoption(bl); if (calc_flag&SCB_DYE) { //Reset DYE color @@ -6412,15 +6408,15 @@ int status_change_end( struct block_list* bl , int type,int tid ) case SC_HIDING: sc->option &= ~OPTION_HIDE; - opt_flag|= 8|4; //Check for warp trigger + AoE trigger + opt_flag|= 2|4; //Check for warp trigger + AoE trigger break; case SC_CLOAKING: sc->option &= ~OPTION_CLOAK; - opt_flag|= 8; + opt_flag|= 2; break; case SC_CHASEWALK: sc->option &= ~(OPTION_CHASEWALK|OPTION_CLOAK); - opt_flag|= 8; + opt_flag|= 2; break; case SC_SIGHT: sc->option &= ~OPTION_SIGHT; @@ -6446,55 +6442,55 @@ int status_change_end( struct block_list* bl , int type,int tid ) case SC_SPEARQUICKEN: case SC_CONCENTRATION: sc->opt3 &= ~0x1; - opt_flag = 2; + opt_flag = 0; break; case SC_OVERTHRUST: case SC_MAXOVERTHRUST: case SC_SWOO: sc->opt3 &= ~0x2; - opt_flag = 2; + opt_flag = 0; break; case SC_ENERGYCOAT: case SC_SKE: sc->opt3 &= ~0x4; - opt_flag = 2; + opt_flag = 0; break; case SC_INCATKRATE: //Simulated Explosion spirits effect. if (bl->type != BL_MOB) break; case SC_EXPLOSIONSPIRITS: sc->opt3 &= ~0x8; - opt_flag = 2; + opt_flag = 0; break; case SC_STEELBODY: case SC_SKA: sc->opt3 &= ~0x10; - opt_flag = 2; + opt_flag = 0; break; case SC_BLADESTOP: sc->opt3 &= ~0x20; - opt_flag = 2; + opt_flag = 0; break; case SC_BERSERK: sc->opt3 &= ~0x80; - opt_flag = 2; + opt_flag = 0; break; case SC_MARIONETTE: case SC_MARIONETTE2: sc->opt3 &= ~0x400; - opt_flag = 2; + opt_flag = 0; break; case SC_ASSUMPTIO: sc->opt3 &= ~0x800; - opt_flag = 2; + opt_flag = 0; break; case SC_WARM: //SG skills [Komurka] sc->opt3 &= ~0x1000; - opt_flag = 2; + opt_flag = 0; break; case SC_KAITE: sc->opt3 &= ~0x2000; - opt_flag = 2; + opt_flag = 0; break; default: opt_flag = 0; @@ -6513,12 +6509,8 @@ int status_change_end( struct block_list* bl , int type,int tid ) else if (sd) clif_status_load(bl,StatusIconChangeTable[type],0); - if(opt_flag) { - if (opt_flag & 2) - clif_changeoption2(bl); - else - clif_changeoption(bl); - } + if(opt_flag) + clif_changeoption(bl); if (calc_flag) status_calc_bl(bl,calc_flag); @@ -6526,7 +6518,7 @@ int status_change_end( struct block_list* bl , int type,int tid ) if(opt_flag&4) //Out of hiding, invoke on place. skill_unit_move(bl,gettick(),1); - if(opt_flag&8 && sd && map_getcell(bl->m,bl->x,bl->y,CELL_CHKNPC)) + if(opt_flag&2 && sd && map_getcell(bl->m,bl->x,bl->y,CELL_CHKNPC)) npc_touch_areanpc(sd,bl->m,bl->x,bl->y); //Trigger on-touch event. return 1; |