Forráskód Böngészése

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

munkrej 2 éve
szülő
commit
4800b5bf72

+ 2 - 0
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 /

+ 2 - 0
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 /

+ 12 - 0
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,

+ 1 - 1
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));
 			}

+ 15 - 6
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		},

+ 6 - 3
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);

+ 8 - 0
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