Jump to content

Recommended Posts

Posted

Hi,

It searches for a suitable location in a circular area around the original spawn location by incrementally increasing the distance from the original point and checking different angles. It then checks if there's a wall or obstruction within safeDistance units from the potential new location.

 

Index: /main/L2GoldClassic/java/gold/lineage2/gameserver/model/Spawn.java
===================================================================
--- /main/L2GoldClassic/java/gold/lineage2/gameserver/model/Spawn.java	(revision 25)
+++ /main/L2GoldClassic/java/gold/lineage2/gameserver/model/Spawn.java	(revision 26)
@@ -29,4 +29,5 @@
 import gold.lineage2.gameserver.data.xml.NpcData;
 import gold.lineage2.gameserver.geoengine.GeoEngine;
+import gold.lineage2.gameserver.geoengine.geodata.GeoStructure;
 import gold.lineage2.gameserver.instancemanager.DropManager;
 import gold.lineage2.gameserver.instancemanager.WalkingManager;
@@ -407,13 +408,24 @@
 		}
 		
-		// Correct Z of monsters. Do not correct Z of flying NPCs.
-		if (npc.isMonster() && !npc.isFlying())
-		{
-			final int geoZ = GeoEngine.getInstance().getHeight(newlocx, newlocy, newlocz);
-			// Do not correct Z distances greater than 300.
-			if (Util.calculateDistance(newlocx, newlocy, newlocz, newlocx, newlocy, geoZ, true, false) < 300)
+		if (npc.isMonster())
+		{
+			// Correct Z of monsters. Do not correct Z of flying NPCs.
+			if (!npc.isFlying())
 			{
-				newlocz = geoZ;
+				final int geoZ = GeoEngine.getInstance().getHeight(newlocx, newlocy, newlocz);
+				// Do not correct Z distances greater than 300.
+				if (Util.calculateDistance(newlocx, newlocy, newlocz, newlocx, newlocy, geoZ, true, false) < 300)
+				{
+					newlocz = geoZ;
+				}
 			}
+			
+			// Find a safe spawn location
+			Location safeSpawnLocation = findSafeSpawnLocation(newlocx, newlocy, newlocz, 200);
+			
+			// Update the spawn location
+			newlocx = safeSpawnLocation.getX();
+			newlocy = safeSpawnLocation.getY();
+			newlocz = safeSpawnLocation.getZ();
 		}
 		
@@ -475,4 +487,53 @@
 		
 		return npc;
+	}
+	
+	/**
+	 * Finds a safe spawn location at least 'safeDistance' units away from the nearest wall.
+	 *
+	 * @param x the original x-coordinate of the spawn location
+	 * @param y the original y-coordinate of the spawn location
+	 * @param z the original z-coordinate of the spawn location
+	 * @param safeDistance the minimum distance from the nearest wall for the new spawn location
+	 * @return a new Location object containing the safe spawn location
+	 */
+	private Location findSafeSpawnLocation(int x, int y, int z, int safeDistance)
+	{
+	    Location newLocation = new Location(x, y, z);
+	    GeoEngine geoEngine = GeoEngine.getInstance();
+
+	    // Search for a safe spawn location in a circular area around the original spawn location
+	    for (int radius = safeDistance; radius < 5000; radius += safeDistance)
+	    {
+	        for (int angle = 0; angle < 360; angle += 45)
+	        {
+	            int newX = x + (int) (radius * Math.cos(Math.toRadians(angle)));
+	            int newY = y + (int) (radius * Math.sin(Math.toRadians(angle)));
+	            int newZ = geoEngine.getHeight(newX, newY, z);
+
+	            boolean canSeeWall = false;
+	            for (int checkDistance = 0; checkDistance <= safeDistance; checkDistance += GeoStructure.CELL_IGNORE_HEIGHT)
+	            {
+	                int checkX = newX + (int) (checkDistance * Math.cos(Math.toRadians(angle)));
+	                int checkY = newY + (int) (checkDistance * Math.sin(Math.toRadians(angle)));
+	                int checkZ = geoEngine.getHeight(checkX, checkY, newZ);
+
+	                if (geoEngine.hasGeoPos(checkX, checkY) && !geoEngine.canMoveToTarget(newX, newY, newZ, checkX, checkY, checkZ, null))
+	                {
+	                    canSeeWall = true;
+	                    break;
+	                }
+	            }
+
+	            if (!canSeeWall)
+	            {
+	                newLocation.setXYZ(newX, newY, newZ);
+	                return newLocation;
+	            }
+	        }
+	    }
+
+	    LOGGER.warning("Could not find a safe spawn location for NPC " + _template.getId() + ". Using original location.");
+	    return newLocation;
 	}
 	

 

  • Like 2

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Posts

    • Rosyk or rusik or whatever u blaim me tha my mouth stinks but I assume you the one who stinks and your perfect pack will be now shared and you can suck a dick )  https://eu2.contabostorage.com/d4b39866f6bb4084b6c969ec8fe20063:kita/Lucera_Classic_Remaster/Lucera Classic Remaster Server and Datapack files.rar  https://eu2.contabostorage.com/d4b39866f6bb4084b6c969ec8fe20063:kita/Lucera_Classic_Remaster/Lucera Classic Remaster Eng Client.rar Drama link   
    • @Huggo Thank you for asking! When you join our Discord, on the Nexus Marketing section there is a #work-showcase channel. There you can see a little bit of what we are able to produce as a final ready-to-post product.  There is also this link in my new personal montage YouTube channel, in which I will be uploading every recent work: https://youtube.com/playlist?list=PLkzBKexKw8Wj8dC2diYndd5yOWOXUQCJW&si=-HGxlovqzvD4qqy2 Two more videos are coming up this week, and a #reviews channel has opened for our clients to let other people know about their experience working with us. Feel free to join our Hub in Discord, and for any inquries you might have don't hesitate to contact me or post your suggestion at #suggestions channel.  
    • Следи за своим вонючим языком, мудак.   Your mouth stinks, go wash your mouth, it's a dump) I don't know who you are or what you are, and I don't recommend buying anything from people outside of my network, as they may sell garbage under the guise of my work. There have been cases where my sales have been compromised. Additionally, reselling below the purchase price has been prohibited. I wish you all the best and peace. I kindly request that the moderators close this topic, as it is no longer relevant and the contact information is outdated.    
  • Topics

×
×
  • Create New...

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock