adds missing mob skill conditions MSC_GROUNDATTACKED and MSC_DAMAGEDGT (#7138)

This commit is contained in:
munkrej 2022-09-22 15:30:17 +02:00 committed by GitHub
parent fa4666d7af
commit 4800b5bf72
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 46 additions and 10 deletions

View File

@ -44,6 +44,8 @@
// casttargeted When a target is in cast range (no condition value).
// rudeattacked When mob is rude attacked (no condition value).
// mobnearbygt When monsters in range become greater than specified number.
// groundattacked When mob is hit by ground targeted skill (no condition value).
// damagedgt When single attack deals greater damage than specified number.
//
// Status abnormalities specified through the statuson/statusoff system:
// anybad (any type of state change) / stone / freeze / stun / sleep /

View File

@ -45,6 +45,8 @@
// casttargeted When a target is in cast range (no condition value).
// rudeattacked When mob is rude attacked (no condition value).
// mobnearbygt When monsters in range become greater than specified number.
// groundattacked When mob is hit by ground targeted skill (no condition value).
// damagedgt When single attack deals greater damage than specified number.
//
// Status abnormalities specified through the statuson/statusoff system:
// anybad (any type of state change) / stone / freeze / stun / sleep /

View File

@ -45,6 +45,8 @@
// casttargeted When a target is in cast range (no condition value).
// rudeattacked When mob is rude attacked (no condition value).
// mobnearbygt When monsters in range become greater than specified number.
// groundattacked When mob is hit by ground targeted skill (no condition value).
// damagedgt When single attack deals greater damage than specified number.
//
// Status abnormalities specified through the statuson/statusoff system:
// anybad (any type of state change) / stone / freeze / stun / sleep /
@ -172,6 +174,7 @@
1038,Osiris@NPC_DARKBREATH,attack,202,5,500,0,5000,no,target,always,0,,,,,,9,
1038,Osiris@NPC_DARKBREATH,chase,202,5,500,0,5000,no,target,always,0,,,,,,9,
1038,Osiris@NPC_POISONATTACK,attack,188,5,2000,0,5000,no,target,always,0,,,,,,9,
1038,Osiris@NPC_ALLHEAL,attack,687,1,10000,0,100000,yes,self,damagedgt,50000,,,,,,,
1038,Osiris@NPC_SUMMONSLAVE,attack,196,5,10000,700,10000,no,self,slavele,3,1522,,,,,,
1038,Osiris@NPC_SUMMONSLAVE,idle,196,5,10000,700,10000,no,self,slavele,3,1522,,,,,,
1038,Osiris@NPC_SUMMONSLAVE,idle,196,7,10000,0,0,no,self,onspawn,0,1029,,,,,,
@ -200,6 +203,7 @@
1039,Baphomet@WZ_VERMILION,attack,85,21,2000,500,2000,no,target,always,0,,,,,,29,
1039,Baphomet@WZ_VERMILION,chase,85,21,5000,500,2000,no,target,skillused,18,,,,,,29,
1039,Baphomet@WZ_VERMILION,chase,85,21,2000,500,2000,no,target,always,0,,,,,,29,
1039,Baphomet@NPC_ALLHEAL,attack,687,1,10000,3000,100000,no,self,damagedgt,50000,,,,,,,
1039,Baphomet@AL_HEAL,idle,28,11,10000,0,5000,yes,self,myhpltmaxrate,50,,,,,,,
1040,Golem@NPC_EMOTION,idle,197,1,2000,0,5000,yes,self,always,0,9,,,,,,
1040,Golem@NPC_STUNATTACK,attack,179,3,500,1500,5000,no,target,always,0,,,,,,6,
@ -863,6 +867,7 @@
1159,Phreeoni@AL_HEAL,idle,28,11,10000,0,5000,yes,self,mystatuson,hiding,,,,,,,
1159,Phreeoni@WZ_HEAVENDRIVE,chase,91,5,10000,0,5000,no,target,skillused,18,,,,,,19,
1159,Phreeoni@AL_HEAL,idle,28,11,10000,0,10000,yes,self,myhpltmaxrate,50,,,,,,,
1159,Phreeoni@NPC_ALLHEAL,attack,687,1,10000,1000,120000,no,self,damagedgt,50000,,,,,,,
1160,Piere@NPC_EMOTION,loot,197,1,2000,0,5000,yes,self,always,0,19,,,,,,
1160,Piere@NPC_GROUNDATTACK,attack,185,2,500,500,5000,no,target,always,0,,,,,,6,
1161,Plankton@NPC_WATERATTACK,attack,184,1,2000,0,5000,yes,target,always,0,,,,,,,
@ -1787,6 +1792,7 @@
1389,Dracula@NPC_INVISIBLE,chase,353,1,2000,200,5000,yes,self,always,0,,,,,,,
1389,Dracula@NPC_SILENCEATTACK,attack,178,5,2000,0,5000,no,target,always,0,,,,,,,
1389,Dracula@NPC_SILENCEATTACK,chase,178,5,2000,0,5000,no,target,always,0,,,,,,,
1389,Dracula@SA_LANDPROTECTOR,attack,288,3,3000,0,5000,yes,self,groundattacked,0,,,,,,,
1389,Dracula@NPC_SUMMONSLAVE,attack,196,16,10000,700,5000,no,self,slavele,5,1419,,,,,,
1389,Dracula@NPC_SUMMONSLAVE,idle,196,16,10000,700,5000,no,self,slavele,5,1419,,,,,,
1389,Dracula@NPC_ENERGYDRAIN,chase,200,1,10000,0,0,yes,target,skillused,18,,,,,,,
@ -1990,6 +1996,7 @@
1418,Evil Snake Lord@NPC_WIDESILENCE,attack,663,5,10000,1000,20000,no,self,myhpltmaxrate,80,,,,,,32,
1418,Evil Snake Lord@MG_FROSTDIVER,attack,15,40,2000,0,5000,yes,target,always,0,,,,,,,
1418,Evil Snake Lord@MG_FROSTDIVER,chase,15,40,2000,0,0,yes,target,always,0,,,,,,,
1418,Evil Snake Lord@NPC_ALLHEAL,attack,687,1,5000,1500,60000,no,self,damagedgt,30000,,,,,,20,
1418,Evil Snake Lord@NPC_SHIELDBRAKE,attack,346,10,2000,0,0,yes,target,always,0,,,,,,2,
1418,Evil Snake Lord@NPC_CALLSLAVE,attack,352,1,10000,0,30000,yes,self,always,0,,,,,,,
1418,Evil Snake Lord@NPC_CALLSLAVE,idle,352,1,10000,0,30000,yes,self,always,0,,,,,,,
@ -2591,6 +2598,7 @@
1511,Amon Ra@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,,
1511,Amon Ra@AL_TELEPORT,walk,26,1,5000,0,5000,yes,self,rudeattacked,,,,,,,,
1511,Amon Ra@AL_HEAL,idle,28,11,10000,0,10000,yes,self,myhpltmaxrate,50,,,,,,,
1511,Amon Ra@WZ_STORMGUST,idle,89,10,3000,0,0,yes,target,groundattacked,0,,,,,,9,
1512,Hyegun@MO_BODYRELOCATION,chase,264,1,2000,500,5000,no,target,always,0,,,,,,,
1512,Hyegun@AS_SONICBLOW,attack,136,5,500,1000,30000,no,target,always,0,,,,,,,
1512,Hyegun@NPC_CRITICALSLASH,attack,170,1,500,0,5000,yes,target,always,0,,,,,,,
@ -3813,6 +3821,7 @@
1719,Detale@AL_HEAL,idle,28,11,10000,0,5000,yes,self,myhpltmaxrate,30,,,,,,47,
1719,Detale@AL_HEAL,attack,28,11,10000,0,5000,yes,self,myhpltmaxrate,30,,,,,,47,
1719,Detale@AL_HEAL,chase,28,11,10000,0,5000,yes,self,myhpltmaxrate,30,,,,,,47,
1719,Detale@NPC_COMET,attack,708,5,5000,2000,60000,no,target,groundattacked,0,,,,,,29,
1720,Hydro@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,,
1720,Hydro@AL_HEAL,idle,28,11,10000,0,5000,yes,self,myhpltmaxrate,30,,,,,,47,
1720,Hydro@AL_HEAL,attack,28,11,10000,0,5000,yes,self,myhpltmaxrate,30,,,,,,47,
@ -7819,6 +7828,7 @@
2251,Gioia@NPC_EARTHQUAKE,chase,653,5,10000,500,20000,no,self,myhpltmaxrate,40,,,,,,,
2251,Gioia@NPC_EARTHQUAKE,attack,653,5,10000,500,20000,no,self,myhpltmaxrate,40,,,,,,,
2251,Gioia@NPC_PULSESTRIKE,attack,661,5,10000,0,15000,yes,self,myhpltmaxrate,60,,,,,,,
2251,Gioia@NPC_ALLHEAL,attack,687,1,10000,1500,120000,no,self,damagedgt,50000,,,,,,,
2251,Gioia@NPC_DRAGONFEAR,attack,659,5,10000,0,10000,yes,self,always,0,,,,,,,
2251,Gioia@NPC_DRAGONFEAR,chase,659,5,10000,0,10000,yes,self,always,0,,,,,,,
2251,Gioia@WZ_METEOR,idle,83,9,10000,0,5000,yes,target,always,0,,,,,,,
@ -8217,6 +8227,7 @@
2362,Nightmare Amon Ra@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,,
2362,Nightmare Amon Ra@AL_TELEPORT,walk,26,1,5000,0,5000,yes,self,rudeattacked,,,,,,,,
2362,Nightmare Amon Ra@AL_HEAL,idle,28,11,10000,0,10000,yes,self,myhpltmaxrate,50,,,,,,,
2362,Nightmare Amon Ra@WZ_STORMGUST,idle,89,10,3000,0,0,yes,target,groundattacked,0,,,,,,9,
// Eclage
2363,Menblatt@KN_PIERCE,attack,56,10,500,700,5000,no,target,always,0,,,,,,6,
@ -12590,6 +12601,7 @@
20340,EL-A17T@NPC_CRITICALSLASH,attack,170,1,2000,500,5000,no,target,always,0,,,,,,,
20340,EL-A17T@AS_SONICBLOW,attack,136,10,1000,0,10000,yes,target,always,0,,,,,,2,
20340,EL-A17T@NPC_AGIUP,chase,350,5,2000,0,60000,no,self,always,0,,,,,,6,
20340,EL-A17T@SA_LANDPROTECTOR,attack,288,3,10000,500,150000,no,self,groundattacked,0,,,,,,,
20341,E-EA1L@AL_DECAGI,attack,30,1,500,1000,5000,no,target,always,0,,,,,,29,
20341,E-EA1L@NPC_HALLUCINATION,chase,207,1,500,500,5000,yes,target,always,0,,,,,,9,
20341,E-EA1L@NPC_HALLUCINATION,attack,207,1,500,500,5000,yes,target,always,0,,,,,,9,

View File

@ -284,7 +284,7 @@ void battle_damage(struct block_list *src, struct block_list *target, int64 dama
// Trigger monster skill condition for non-skill attacks.
if (!status_isdead(target) && src != target) {
if (damage > 0)
mobskill_event(md, src, tick, attack_type);
mobskill_event(md, src, tick, attack_type, damage);
if (skill_id > 0)
mobskill_event(md, src, tick, MSC_SKILLUSED | (skill_id << 16));
}

View File

@ -3697,7 +3697,7 @@ bool mob_chat_display_message(mob_data &md, uint16 msg_id) {
/*==========================================
* Skill use judging
*------------------------------------------*/
int mobskill_use(struct mob_data *md, t_tick tick, int event)
int mobskill_use(struct mob_data *md, t_tick tick, int event, int64 damage)
{
struct block_list *fbl = NULL; //Friend bl, which can either be a BL_PC or BL_MOB depending on the situation. [Skotlex]
struct block_list *bl;
@ -3718,7 +3718,8 @@ int mobskill_use(struct mob_data *md, t_tick tick, int event)
//Pick a starting position and loop from that.
i = battle_config.mob_ai&0x100?rnd()%ms.size():0;
for (n = 0; n < ms.size(); i++, n++) {
int c2, flag = 0;
int64 c2;
int flag = 0;
if (i == ms.size())
i = 0;
@ -3743,6 +3744,10 @@ int mobskill_use(struct mob_data *md, t_tick tick, int event)
flag = 1; //Trigger skill.
else if (ms[i]->cond1 == MSC_SKILLUSED)
flag = ((event & 0xffff) == MSC_SKILLUSED && ((event >> 16) == c2 || c2 == 0));
else if (ms[i]->cond1 == MSC_GROUNDATTACKED && damage > 0)
flag = ((event & 0xffff) == MSC_SKILLUSED && skill_get_inf((event >> 16))&INF_GROUND_SKILL);
else if (ms[i]->cond1 == MSC_DAMAGEDGT && damage > 0 && !((event & 0xffff) == MSC_SKILLUSED)) //Avoid double check if skill has been used [datawulf]
flag = (damage > c2);
else if(event == -1){
//Avoid entering on defined events to avoid "hyper-active skill use" due to the overflow of calls to this function in battle.
switch (ms[i]->cond1)
@ -3928,7 +3933,7 @@ int mobskill_use(struct mob_data *md, t_tick tick, int event)
/*==========================================
* Skill use event processing
*------------------------------------------*/
int mobskill_event(struct mob_data *md, struct block_list *src, t_tick tick, int flag)
int mobskill_event(struct mob_data *md, struct block_list *src, t_tick tick, int flag, int64 damage)
{
int target_id, res = 0;
@ -3942,11 +3947,13 @@ int mobskill_event(struct mob_data *md, struct block_list *src, t_tick tick, int
if (flag == -1)
res = mobskill_use(md, tick, MSC_CASTTARGETED);
else if ((flag&0xffff) == MSC_SKILLUSED)
res = mobskill_use(md, tick, flag);
res = mobskill_use(md, tick, flag, damage);
else if (flag&BF_SHORT)
res = mobskill_use(md, tick, MSC_CLOSEDATTACKED);
res = mobskill_use(md, tick, MSC_CLOSEDATTACKED, damage);
else if (flag&BF_LONG && !(flag&BF_MAGIC)) //Long-attacked should not include magic.
res = mobskill_use(md, tick, MSC_LONGRANGEATTACKED);
res = mobskill_use(md, tick, MSC_LONGRANGEATTACKED, damage);
else if (damage > 0) //Trigger for any damage dealt from other attack types without affecting other triggers [datawulf]
res = mobskill_use(md, tick, -2, damage);
if (!res)
//Restore previous target only if skill condition failed to trigger. [Skotlex]
@ -5826,6 +5833,8 @@ static bool mob_parse_row_mobskilldb(char** str, int columns, int current)
{ "alchemist", MSC_ALCHEMIST },
{ "onspawn", MSC_SPAWN },
{ "mobnearbygt", MSC_MOBNEARBYGT },
{ "groundattacked", MSC_GROUNDATTACKED },
{ "damagedgt", MSC_DAMAGEDGT },
}, cond2[] ={
{ "anybad", -1 },
{ "stone", SC_STONE },

View File

@ -193,7 +193,8 @@ struct s_mob_skill {
short permillage;
int casttime,delay;
short cancel;
short cond1,cond2;
short cond1;
int64 cond2;
short target;
int val[5];
short emotion;
@ -457,6 +458,8 @@ enum e_mob_skill_condition {
MSC_ALCHEMIST,
MSC_SPAWN,
MSC_MOBNEARBYGT,
MSC_GROUNDATTACKED,
MSC_DAMAGEDGT,
};
// The data structures for storing delayed item drops
@ -526,8 +529,8 @@ int mob_warpslave(struct block_list *bl, int range);
int mob_linksearch(struct block_list *bl,va_list ap);
bool mob_chat_display_message (mob_data &md, uint16 msg_id);
int mobskill_use(struct mob_data *md,t_tick tick,int event);
int mobskill_event(struct mob_data *md,struct block_list *src,t_tick tick, int flag);
int mobskill_use(struct mob_data *md,t_tick tick,int event, int64 damage = 0);
int mobskill_event(struct mob_data *md,struct block_list *src,t_tick tick, int flag, int64 damage = 0);
int mob_summonslave(struct mob_data *md2,int *value,int amount,uint16 skill_id);
int mob_countslave(struct block_list *bl);
int mob_count_sub(struct block_list *bl, va_list ap);

View File

@ -3965,6 +3965,14 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
}
}
// Trigger monster skill condition for damage skills.
if (bl->type == BL_MOB && src != bl && !status_isdead(bl)) {
if (damage > 0)
mobskill_event(BL_CAST(BL_MOB, bl), src, tick, dmg.flag, damage);
if (skill_id > 0)
mobskill_event(BL_CAST(BL_MOB, bl), src, tick, MSC_SKILLUSED | (skill_id << 16), damage);
}
if (tsc && skill_id != NPC_EVILLAND && skill_id != SP_SOULEXPLOSION && skill_id != SJ_NOVAEXPLOSING
#ifndef RENEWAL
&& skill_id != PA_PRESSURE && skill_id != HW_GRAVITATION