From 4800b5bf725fe9fe68cb75a8d0d3f4c7252e3cc8 Mon Sep 17 00:00:00 2001 From: munkrej Date: Thu, 22 Sep 2022 15:30:17 +0200 Subject: [PATCH] adds missing mob skill conditions MSC_GROUNDATTACKED and MSC_DAMAGEDGT (#7138) --- db/import-tmpl/mob_skill_db.txt | 2 ++ db/pre-re/mob_skill_db.txt | 2 ++ db/re/mob_skill_db.txt | 12 ++++++++++++ src/map/battle.cpp | 2 +- src/map/mob.cpp | 21 +++++++++++++++------ src/map/mob.hpp | 9 ++++++--- src/map/skill.cpp | 8 ++++++++ 7 files changed, 46 insertions(+), 10 deletions(-) diff --git a/db/import-tmpl/mob_skill_db.txt b/db/import-tmpl/mob_skill_db.txt index 64d081af67..4b45c8b55d 100644 --- a/db/import-tmpl/mob_skill_db.txt +++ b/db/import-tmpl/mob_skill_db.txt @@ -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 / diff --git a/db/pre-re/mob_skill_db.txt b/db/pre-re/mob_skill_db.txt index 29f31b1b16..036d704845 100644 --- a/db/pre-re/mob_skill_db.txt +++ b/db/pre-re/mob_skill_db.txt @@ -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 / diff --git a/db/re/mob_skill_db.txt b/db/re/mob_skill_db.txt index d0a868e2d2..348a7d8d42 100644 --- a/db/re/mob_skill_db.txt +++ b/db/re/mob_skill_db.txt @@ -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, diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 48a6dc7900..8a83bc5904 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -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)); } diff --git a/src/map/mob.cpp b/src/map/mob.cpp index 57705bf185..fd6fbf8c77 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -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 }, diff --git a/src/map/mob.hpp b/src/map/mob.hpp index faccf1e89f..c1e5200ff0 100644 --- a/src/map/mob.hpp +++ b/src/map/mob.hpp @@ -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); diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 42a75ac6e5..ad5d43700f 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -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