Quellcode durchsuchen

Reworked random walk and minion spawn coords in more smart way (Pifagor rulez).
Added geodata check for dodge.
Part of attackable AI reworked for reduce number of NPEs.

_DS_ vor 15 Jahren
Ursprung
Commit
42eac785c5

+ 38 - 26
L2_GameServer/java/com/l2jserver/gameserver/ai/L2AttackableAI.java

@@ -520,13 +520,14 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 		// Minions following leader
 		if (_actor instanceof L2MinionInstance && ((L2MinionInstance) _actor).getLeader() != null)
 		{
-			int offset;
+			final int offset;
+			final int minRadius = 30;
 			
 			if (_actor.isRaidMinion())
 				offset = 500; // for Raids - need correction
 			else
 				offset = 200; // for normal minions - need correction :)
-				
+	
 			if (((L2MinionInstance) _actor).getLeader().isRunning())
 				_actor.setRunning();
 			else
@@ -535,8 +536,18 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 			if (_actor.getPlanDistanceSq(((L2MinionInstance) _actor).getLeader()) > offset * offset)
 			{
 				int x1, y1, z1;
-				x1 = ((L2MinionInstance) _actor).getLeader().getX() + Rnd.nextInt((offset - 30) * 2) - (offset - 30);
-				y1 = ((L2MinionInstance) _actor).getLeader().getY() + Rnd.nextInt((offset - 30) * 2) - (offset - 30);
+				x1 = Rnd.get(minRadius * 2, offset * 2); // x
+				y1 = Rnd.get(x1, offset * 2); // distance
+				y1 = (int)Math.sqrt(y1*y1 - x1*x1); // y
+				if (x1 > offset + minRadius)
+					x1 = ((L2MinionInstance) _actor).getLeader().getX() + x1 - offset;
+				else
+					x1 = ((L2MinionInstance) _actor).getLeader().getX() - x1 + minRadius;
+				if (y1 > offset - minRadius)
+					y1 = ((L2MinionInstance) _actor).getLeader().getY() + y1 - offset;
+				else
+					y1 = ((L2MinionInstance) _actor).getLeader().getY() - y1 + minRadius;
+
 				z1 = ((L2MinionInstance) _actor).getLeader().getZ();
 				// Move the actor to Location (x,y,z) server side AND client side by sending Server->Client packet CharMoveToLocation (broadcast)
 				moveTo(x1, y1, z1);
@@ -593,12 +604,15 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 				y1 = npc.getSpawn().getLocy();
 				z1 = npc.getSpawn().getLocz();
 
-				if (!_actor.isInsideRadius(x1, y1, z1, range + range, true, false))
+				if (!_actor.isInsideRadius(x1, y1, range, false))
 					npc.setisReturningToSpawnPoint(true);
 				else
 				{
-					x1 += Rnd.nextInt(range * 2) - range;
-					y1 += Rnd.nextInt(range * 2) - range;
+					x1 = Rnd.nextInt(range * 2); // x
+					y1 = Rnd.get(x1, range * 2); // distance
+					y1 = (int)Math.sqrt(y1*y1 - x1*x1); // y
+					x1 += npc.getSpawn().getLocx() - range;
+					y1 += npc.getSpawn().getLocy() - range;
 					z1 = npc.getZ();
 				}
 			}
@@ -740,27 +754,24 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 		double dist = 0;
 		int dist2 = 0;
 		int range = 0;
-		L2Character MostHate = ((L2Attackable) _actor).getMostHated();
-		//L2Character ctarget = (L2Character)_actor.getTarget();
-		try
-		{
-			setAttackTarget(MostHate);
-			_actor.setTarget(MostHate);
-			dist = Math.sqrt(_actor.getPlanDistanceSq(getAttackTarget().getX(), getAttackTarget().getY()));
-			dist2= (int) dist - _actor.getTemplate().collisionRadius;
-			range = _actor.getPhysicalAttackRange() + _actor.getTemplate().collisionRadius + getAttackTarget().getTemplate().collisionRadius;
-			if(getAttackTarget().isMoving())
-			{
-				range = range + 50;
-				if(_actor.isMoving())
-					range = range + 50;
-			}
-		}
-		catch (NullPointerException e)
+		L2Character mostHate = ((L2Attackable) _actor).getMostHated();
+		if (mostHate == null)
 		{
 			setIntention(AI_INTENTION_ACTIVE);
 			return;
 		}
+		setAttackTarget(mostHate);
+		_actor.setTarget(mostHate);
+		dist = Math.sqrt(_actor.getPlanDistanceSq(mostHate.getX(), mostHate.getY()));
+		dist2= (int) dist - _actor.getTemplate().collisionRadius;
+		range = _actor.getPhysicalAttackRange() + _actor.getTemplate().collisionRadius + mostHate.getTemplate().collisionRadius;
+		if(mostHate.isMoving())
+		{
+			range = range + 50;
+			if(_actor.isMoving())
+				range = range + 50;
+		}
+
 		//------------------------------------------------------
 		// In case many mobs are trying to hit from same place, move a bit,
 		// circling around the target
@@ -818,8 +829,9 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 						posY=posY + Rnd.get(100);
 					else
 						posY=posY - Rnd.get(100);
-					
-					setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(posX, posY, posZ, 0));
+
+					if (Config.GEODATA == 0 || GeoData.getInstance().canMoveFromToTarget(_actor.getX(), _actor.getY(), posZ, posX, posY, posZ, _actor.getInstanceId()))
+						setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new L2CharPosition(posX, posY, posZ, 0));
 					return;
 				//}
 			}

+ 15 - 16
L2_GameServer/java/com/l2jserver/gameserver/util/MinionList.java

@@ -241,22 +241,21 @@ public class MinionList
 		monster.setInstanceId(instanceId);
 		
 		// Init the position of the Minion and add it in the world as a visible object
-		int spawnConstant;
-		int randSpawnLim = 170;
-		int randPlusMin = 1;
-		spawnConstant = Rnd.nextInt(randSpawnLim);
-		//randomize +/-
-		randPlusMin = Rnd.nextInt(2);
-		if (randPlusMin == 1)
-			spawnConstant *= -1;
-		int newX = master.getX() + Math.round(spawnConstant);
-		spawnConstant = Rnd.nextInt(randSpawnLim);
-		//randomize +/-
-		randPlusMin = Rnd.nextInt(2);
-		if (randPlusMin == 1)
-			spawnConstant *= -1;
-		int newY = master.getY() + Math.round(spawnConstant);
-		
+		final int offset = 200;
+		final int minRadius = 30;
+
+		int newX = Rnd.get(minRadius * 2, offset * 2); // x
+		int newY = Rnd.get(newX, offset * 2); // distance
+		newY = (int)Math.sqrt(newY*newY - newX*newX); // y
+		if (newX > offset + minRadius)
+			newX = master.getX() + newX - offset;
+		else
+			newX = master.getX() - newX + minRadius;
+		if (newY > offset - minRadius)
+			newY = master.getY() + newY - offset;
+		else
+			newY = master.getY() - newY + minRadius;
+
 		monster.spawnMe(newX, newY, master.getZ());
 		
 		if (Config.DEBUG)