Bläddra i källkod

perf(npc): Avoiding redundant checks in L2Npc#getAggroRange()

This method is called very often when updating KnownLists.
It was effectively checking the AI value was present 3 times for each invocation where the value exists, since the check was duplicated in both L2Npc#getAIValue() and NpcPersonalAIData#getAIValue().
Removed the duplicated checks and added a few tests.
Noe Caratini 2 år sedan
förälder
incheckning
ef1ebe2b0a

+ 5 - 2
src/main/java/com/l2jserver/gameserver/datatables/NpcPersonalAIData.java

@@ -61,8 +61,11 @@ public class NpcPersonalAIData {
 	 * @param paramName parameter to check
 	 * @return value of given parameter for given spawn name
 	 */
-	public int getAIValue(String spawnName, String paramName) {
-		return hasAIValue(spawnName, paramName) ? _AIData.get(spawnName).get(paramName) : -1;
+	public int getAIValue(final String spawnName, final String paramName) {
+		if (_AIData.containsKey(spawnName)) {
+			return _AIData.get(spawnName).getOrDefault(paramName, -1);
+		}
+		return -1;
 	}
 	
 	/**

+ 11 - 6
src/main/java/com/l2jserver/gameserver/model/actor/L2Npc.java

@@ -381,12 +381,14 @@ public class L2Npc extends L2Character {
 	 * @return the aggression range
 	 */
 	public int getAggroRange() {
-		if (hasAIValue("aggroRange")) {
-			return getAIValue("aggroRange");
+		final int aiAggroRange = getAIValue("aggroRange");
+		if (aiAggroRange >= 0) {
+			return aiAggroRange;
 		}
-		
-		if (npc().getMaxAggroRange() > 0) {
-			return Math.min(getTemplate().getAggroRange(), npc().getMaxAggroRange());
+
+		final int maxAggroRange = npc().getMaxAggroRange();
+		if (maxAggroRange > 0) {
+			return Math.min(getTemplate().getAggroRange(), maxAggroRange);
 		}
 		return getTemplate().getAggroRange();
 	}
@@ -1417,7 +1419,10 @@ public class L2Npc extends L2Character {
 	 * @return given AI parameter value
 	 */
 	public int getAIValue(final String paramName) {
-		return hasAIValue(paramName) ? NpcPersonalAIData.getInstance().getAIValue(getSpawn().getName(), paramName) : -1;
+		if (getSpawn() == null || getSpawn().getName() == null) {
+			return -1;
+		}
+		return NpcPersonalAIData.getInstance().getAIValue(getSpawn().getName(), paramName);
 	}
 	
 	/**

+ 82 - 0
src/test/java/com/l2jserver/gameserver/datatables/NpcPersonalAIDataTest.java

@@ -0,0 +1,82 @@
+/*
+ * Copyright © 2004-2021 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.datatables;
+
+import com.l2jserver.gameserver.model.L2Spawn;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.when;
+
+/**
+ * @author Noé Caratini aka Kita
+ */
+@ExtendWith(MockitoExtension.class)
+public class NpcPersonalAIDataTest {
+    private static final String SPAWN1_NAME = "spawn1";
+    private static final String PARAM_1 = "param1";
+    private static final String PARAM_2 = "param2";
+    private static final Map<String, Integer> SPAWN1_DATA = Map.of(
+            PARAM_1, 10,
+            PARAM_2, 20
+    );
+
+    @Mock
+    private L2Spawn spawn;
+
+    private NpcPersonalAIData aiData;
+
+    @BeforeEach
+    void setUp() {
+        when(spawn.getName()).thenReturn(SPAWN1_NAME);
+
+        aiData = new NpcPersonalAIData();
+
+        aiData.storeData(spawn, SPAWN1_DATA);
+    }
+
+    @Test
+    public void shouldReturnNegativeAIValueForInvalidSpawnName() {
+        final int aiValue = aiData.getAIValue("invalid", "invalid");
+
+        assertThat(aiValue).isNegative();
+    }
+
+    @Test
+    public void shouldReturnNegativeAIValueForInvalidParamName() {
+        final int aiValue = aiData.getAIValue(SPAWN1_NAME, "invalid");
+
+        assertThat(aiValue).isNegative();
+    }
+
+    @Test
+    public void shouldReturnAIValue() {
+        final int aiValue1 = aiData.getAIValue(SPAWN1_NAME, PARAM_1);
+        final int aiValue2 = aiData.getAIValue(SPAWN1_NAME, PARAM_2);
+
+        assertThat(aiValue1).isEqualTo(10);
+        assertThat(aiValue2).isEqualTo(20);
+    }
+}