Browse Source

Experimental: apply skill effects first and notify AI about attack later. Should help with backstabs on mobs.

_DS_ 15 years ago
parent
commit
63f523f96b

+ 50 - 27
L2_GameServer/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -6440,14 +6440,6 @@ public abstract class L2Character extends L2Object
 								// Signets are a special case, casted on target_self but don't harm self
 								if (skill.getSkillType() != L2SkillType.SIGNET && skill.getSkillType() != L2SkillType.SIGNET_CASTTIME)
 								{
-									if (skill.getSkillType() != L2SkillType.AGGREDUCE
-											&& skill.getSkillType() != L2SkillType.AGGREDUCE_CHAR
-											&& skill.getSkillType() != L2SkillType.AGGREMOVE
-											&& ((L2Character)target).hasAI())
-									{
-										// notify target AI about the attack
-										((L2Character)target).getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, player);
-									}
 									if (target instanceof L2PcInstance)
 									{
 										((L2PcInstance)target).getAI().clientStartAutoAttack();
@@ -6467,6 +6459,19 @@ public abstract class L2Character extends L2Object
 								}
 							}
 							else if (target instanceof L2Attackable)
+							{
+								switch (skill.getId())
+								{
+									case 51: // Lure
+									case 511: // Temptation
+										break;
+									default:
+										// add attacker into list
+										((L2Character)target).addAttackerToAttackByList(this);
+								}
+							}
+							// notify target AI about the attack
+							if (((L2Character)target).hasAI())
 							{
 								switch (skill.getSkillType())
 								{
@@ -6475,18 +6480,7 @@ public abstract class L2Character extends L2Object
 									case AGGREMOVE:
 										break;
 									default:
-										switch (skill.getId())
-										{
-											case 51: // Lure
-											case 511: // Temptation
-												break;
-											default:
-												// add attacker into list
-												((L2Character)target).addAttackerToAttackByList(this);
-										}
-										// notify target AI about the attack
 										((L2Character)target).getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, this);
-										break;
 								}
 							}
 						}
@@ -6499,13 +6493,20 @@ public abstract class L2Character extends L2Object
 										(((L2PcInstance)target).getPvpFlag() > 0 ||
 												((L2PcInstance)target).getKarma() > 0)) player.updatePvPStatus();
 							}
-							else if (target instanceof L2Attackable 
-									&& !(skill.getSkillType() == L2SkillType.SUMMON)
-									&& !(skill.getSkillType() == L2SkillType.BEAST_FEED) 
-									&& !(skill.getSkillType() == L2SkillType.UNLOCK)
-									&& !(skill.getSkillType() == L2SkillType.DELUXE_KEY_UNLOCK)
-							)
-								player.updatePvPStatus();
+							else if (target instanceof L2Attackable)
+							{
+								switch (skill.getSkillType())
+								{
+									case SUMMON:
+									case BEAST_FEED:
+									case UNLOCK:
+									case DELUXE_KEY_UNLOCK:
+									case UNLOCK_SPECIAL:
+										break;
+									default:
+										player.updatePvPStatus();
+								}
+							}
 						}
 					}
 				}
@@ -6534,8 +6535,30 @@ public abstract class L2Character extends L2Object
 				handler.useSkill(this, skill, targets);
 			else
 				skill.useSkill(this, targets);
-			
+
+			// Notify AI
+			if (skill.isOffensive())
+			{
+				switch (skill.getSkillType())
+				{
+					case AGGREDUCE:
+					case AGGREDUCE_CHAR:
+					case AGGREMOVE:
+						break;
+					default:
+						for (L2Object target : targets)
+						{
+							if (target instanceof L2Character && ((L2Character)target).hasAI())
+							{
+								// notify target AI about the attack
+								((L2Character)target).getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, this);
+							}
+						}
+						break;
+				}
+			}
 		}
+
 		catch (Exception e)
 		{
 			_log.log(Level.WARNING, getClass().getSimpleName()+": callSkill() failed.", e);