Jelajahi Sumber

Target system and AI adjustments.

* Fixed mobs adding themself to their own aggro list.
* Fixed mobs to not hit mobs with skills which affect multiple targets.
* Fixed ENEMY_ONLY to also allow Karma players as target.
HorridoJoho 3 tahun lalu
induk
melakukan
cdb429c1d0

+ 5 - 3
src/main/java/com/l2jserver/gameserver/ai/L2AttackableAI.java

@@ -1898,6 +1898,10 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable {
 	 */
 	 */
 	@Override
 	@Override
 	protected void onEvtAttacked(L2Character attacker) {
 	protected void onEvtAttacked(L2Character attacker) {
+		if (attacker == getActiveChar()) {
+			return;
+		}
+
 		L2Attackable me = getActiveChar();
 		L2Attackable me = getActiveChar();
 		
 		
 		// Calculate the attack timeout
 		// Calculate the attack timeout
@@ -1923,9 +1927,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable {
 			setIntention(CtrlIntention.AI_INTENTION_ATTACK, attacker);
 			setIntention(CtrlIntention.AI_INTENTION_ATTACK, attacker);
 		}
 		}
 		
 		
-		if (me instanceof L2MonsterInstance) {
-			L2MonsterInstance master = (L2MonsterInstance) me;
-			
+		if (me instanceof L2MonsterInstance master) {
 			if (master.hasMinions()) {
 			if (master.hasMinions()) {
 				master.getMinionList().onAssist(me, attacker);
 				master.getMinionList().onAssist(me, attacker);
 			}
 			}

+ 1 - 3
src/main/java/com/l2jserver/gameserver/model/actor/L2Attackable.java

@@ -72,8 +72,6 @@ import com.l2jserver.gameserver.model.events.impl.character.npc.attackable.OnAtt
 import com.l2jserver.gameserver.model.holders.ItemHolder;
 import com.l2jserver.gameserver.model.holders.ItemHolder;
 import com.l2jserver.gameserver.model.items.L2Item;
 import com.l2jserver.gameserver.model.items.L2Item;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
-import com.l2jserver.gameserver.model.skills.AbnormalType;
-import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.skills.Skill;
 import com.l2jserver.gameserver.model.skills.Skill;
 import com.l2jserver.gameserver.model.zone.ZoneId;
 import com.l2jserver.gameserver.model.zone.ZoneId;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.SystemMessageId;
@@ -589,7 +587,7 @@ public class L2Attackable extends L2Npc {
 	 * @param aggro The hate (=damage) given by the attacker L2Character
 	 * @param aggro The hate (=damage) given by the attacker L2Character
 	 */
 	 */
 	public void addDamageHate(L2Character attacker, int damage, long aggro) {
 	public void addDamageHate(L2Character attacker, int damage, long aggro) {
-		if (attacker == null) {
+		if (attacker == null || attacker == this) {
 			return;
 			return;
 		}
 		}
 		
 		

+ 1 - 1
src/main/java/com/l2jserver/gameserver/model/actor/instance/L2MonsterInstance.java

@@ -64,7 +64,7 @@ public class L2MonsterInstance extends L2Attackable {
 	 */
 	 */
 	@Override
 	@Override
 	public boolean isAutoAttackable(L2Character attacker) {
 	public boolean isAutoAttackable(L2Character attacker) {
-		return super.isAutoAttackable(attacker) && !isEventMob();
+		return super.isAutoAttackable(attacker) && !attacker.isMonster() && !isEventMob();
 	}
 	}
 	
 	
 	@Override
 	@Override

+ 1 - 1
src/main/java/com/l2jserver/gameserver/model/skills/targets/TargetType.java

@@ -213,7 +213,7 @@ public enum TargetType {
 			}
 			}
 			
 			
 			// Cannot PvP.
 			// Cannot PvP.
-			if (!player.checkIfPvP(targetCreature)) {
+			if (!player.checkIfPvP(targetCreature) && (target.isPlayable() && target.getActingPlayer().getKarma() == 0)) {
 				player.sendPacket(INCORRECT_TARGET);
 				player.sendPacket(INCORRECT_TARGET);
 				return null;
 				return null;
 			}
 			}