summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/map/battle.c2
-rw-r--r--src/map/mob.c5
-rw-r--r--src/map/mob.h7
-rw-r--r--src/map/pet.c2
-rw-r--r--src/map/skill.c16
-rw-r--r--src/map/status.c68
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;