瀏覽代碼

monsters ignore the pvp checks in ENEMY_ONLY

Sky 1 年之前
父節點
當前提交
493258a00e

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

@@ -139,12 +139,16 @@ public enum TargetType {
 				caster.sendPacket(INCORRECT_TARGET);
 				return null;
 			}
-			
+
+			if (!caster.isPlayable()) {
+				return target;
+			}
+
 			final var player = caster.getActingPlayer();
 			if (player == null) {
 				return null;
 			}
-			
+
 			// In Olympiad, different sides.
 			if (player.isInOlympiadMode()) {
 				final var targetPlayer = target.getActingPlayer();
@@ -154,7 +158,7 @@ public enum TargetType {
 				player.sendPacket(INCORRECT_TARGET);
 				return null;
 			}
-			
+
 			final var targetCreature = (L2Character) target;
 			// In Duel, different sides.
 			if (player.isInDuelWith(targetCreature)) {
@@ -163,61 +167,61 @@ public enum TargetType {
 				final var teamA = duel.getTeamA();
 				final var teamB = duel.getTeamB();
 				if ((teamA.contains(player) && teamB.contains(targetPlayer)) || //
-					(teamB.contains(player) && teamA.contains(targetPlayer))) {
+						(teamB.contains(player) && teamA.contains(targetPlayer))) {
 					return target;
 				}
 				player.sendPacket(INCORRECT_TARGET);
 				return null;
 			}
-			
+
 			// Not in same party.
 			if (player.isInPartyWith(targetCreature)) {
 				player.sendPacket(INCORRECT_TARGET);
 				return null;
 			}
-			
+
 			// In PVP Zone.
 			if (player.isInsideZone(PVP)) {
 				return target;
 			}
-			
+
 			// Not in same clan.
 			if (player.isInClanWith(targetCreature)) {
 				player.sendPacket(INCORRECT_TARGET);
 				return null;
 			}
-			
+
 			// TODO(Zoey76): Validate.
 			// Not in same alliance.
 			if (player.isInAllyWith(targetCreature)) {
 				player.sendPacket(INCORRECT_TARGET);
 				return null;
 			}
-			
+
 			// TODO(Zoey76): Validate.
 			// Not in same command channel.
 			if (player.isInCommandChannelWith(targetCreature)) {
 				player.sendPacket(INCORRECT_TARGET);
 				return null;
 			}
-			
+
 			// Not on same Siege Side.
 			if (player.isOnSameSiegeSideWith(targetCreature)) {
 				player.sendPacket(INCORRECT_TARGET);
 				return null;
 			}
-			
+
 			// At Clan War.
 			if (player.isAtWarWith(targetCreature)) {
 				return target;
 			}
-			
+
 			// Cannot PvP.
 			if (!player.checkIfPvP(targetCreature) && (target.isPlayable() && (target.getActingPlayer().getKarma() == 0))) {
 				player.sendPacket(INCORRECT_TARGET);
 				return null;
 			}
-			
+
 			return target;
 		}
 	},

+ 64 - 20
src/test/java/com/l2jserver/gameserver/model/skills/targets/TargetTypeTest.java

@@ -18,10 +18,14 @@
  */
 package com.l2jserver.gameserver.model.skills.targets;
 
-import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
@@ -38,45 +42,85 @@ import com.l2jserver.gameserver.model.skills.Skill;
  */
 @ExtendWith(MockitoExtension.class)
 public class TargetTypeTest {
-	
 	@Mock
 	private Skill skill;
-	@Mock
-	private L2Character caster;
-	@Mock
-	private L2Object target;
-	
+
 	@Test
 	public void doorTreasureShouldReturnNullIfTargetIsNull() {
-		L2Object result = TargetType.DOOR_TREASURE.getTarget(skill, caster, null);
-		
-		assertThat(result).isNull();
+		final var caster = mock(L2Character.class);
+
+		final var result = TargetType.DOOR_TREASURE.getTarget(skill, caster, null);
+
+		assertNull(result);
 	}
 	
 	@Test
     public void doorTreasureShouldReturnNullIfTargetIsNotADoorOrChest() {
+		final var target = mock(L2Object.class);
         when(target.isDoor()).thenReturn(false);
 
-        L2Object result = TargetType.DOOR_TREASURE.getTarget(skill, caster, target);
+		final var caster = mock(L2Character.class);
+
+		final var result = TargetType.DOOR_TREASURE.getTarget(skill, caster, target);
 
-        assertThat(result).isNull();
+		assertNull(result);
     }
 	
 	@Test
     public void doorTreasureShouldReturnTargetIfDoor() {
+		final var target = mock(L2Object.class);
         when(target.isDoor()).thenReturn(true);
 
-        L2Object result = TargetType.DOOR_TREASURE.getTarget(skill, caster, target);
+		final var caster = mock(L2Character.class);
+
+		final var result = TargetType.DOOR_TREASURE.getTarget(skill, caster, target);
 
-        assertThat(result).isSameAs(target);
+		assertEquals(target, result);
     }
 	
 	@Test
 	public void doorTreasureShouldReturnTargetIfChest() {
-		target = mock(L2ChestInstance.class);
-		
-		L2Object result = TargetType.DOOR_TREASURE.getTarget(skill, caster, target);
-		
-		assertThat(result).isSameAs(target);
+		final var target = mock(L2ChestInstance.class);
+		final var caster = mock(L2Character.class);
+
+		final var result = TargetType.DOOR_TREASURE.getTarget(skill, caster, target);
+
+		assertEquals(target, result);
+	}
+
+	@Test
+	public void testMonstersCanUseEnemyOnlySkillsOnPc() {
+		final var caster = mock(L2MonsterInstance.class);
+		when(caster.getObjectId()).thenReturn(1);
+		when(caster.isPlayable()).thenReturn(false);
+
+		final var target = mock(L2PcInstance.class);
+		when(target.isCharacter()).thenReturn(true);
+		when(target.isDead()).thenReturn(false);
+		when(target.getObjectId()).thenReturn(2);
+		when(target.isAutoAttackable(any())).thenReturn(true);
+
+		final var result = TargetType.ENEMY_ONLY.getTarget(skill, caster, target);
+
+		assertEquals(target, result);
+	}
+
+	@Test
+	public void testPvpChecksReachedForEnemyOnlySkills() {
+		final var caster = mock(L2PcInstance.class);
+		when(caster.getObjectId()).thenReturn(1);
+		when(caster.isPlayable()).thenReturn(true);
+		when(caster.getActingPlayer()).thenReturn(caster);
+		when(caster.isInOlympiadMode()).thenReturn(true);
+
+		final var target = mock(L2PcInstance.class);
+		when(target.isCharacter()).thenReturn(true);
+		when(target.isDead()).thenReturn(false);
+		when(target.getObjectId()).thenReturn(2);
+		when(target.isAutoAttackable(any())).thenReturn(true);
+
+		final var result = TargetType.ENEMY_ONLY.getTarget(skill, caster, target);
+
+		assertNull(result);
 	}
-}
+}