Jump to content
  • 0

Need Help To Fix In Exception In Thread "aistpool-5".


Question

Posted

L2J aCis.

Error:

Exception in thread "AISTPool-5" java.lang.StackOverflowError
    at net.sf.l2j.gameserver.model.actor.instance.L2PcInstance.startWaterTask(L2PcInstance.java:9109)
    at net.sf.l2j.gameserver.model.actor.instance.L2PcInstance.checkWaterState(L2PcInstance.java:9122)
    at net.sf.l2j.gameserver.model.actor.instance.L2PcInstance.revalidateZone(L2PcInstance.java:1540)
    at net.sf.l2j.gameserver.ai.L2CharacterAI.onEvtArrived(L2CharacterAI.java:626)
    at net.sf.l2j.gameserver.ai.AbstractAI.notifyEvent(AbstractAI.java:373)
    at net.sf.l2j.gameserver.ai.AbstractAI.notifyEvent(AbstractAI.java:296)

    at net.sf.l2j.gameserver.model.actor.L2Character.moveToLocation(L2Character.java:3586)
    at net.sf.l2j.gameserver.model.actor.L2Character$AIAccessor.moveTo(L2Character.java:2819)
    at net.sf.l2j.gameserver.ai.AbstractAI.moveTo(AbstractAI.java:538)
    at net.sf.l2j.gameserver.ai.AbstractAI.moveToPawn(AbstractAI.java:494)
    at net.sf.l2j.gameserver.ai.L2CharacterAI.maybeMoveToPawn(L2CharacterAI.java:877)
    at net.sf.l2j.gameserver.ai.L2PlayerAI.thinkCast(L2PlayerAI.java:235)
    at net.sf.l2j.gameserver.ai.L2PlayerAI.onEvtThink(L2PlayerAI.java:312)
    at net.sf.l2j.gameserver.ai.L2CharacterAI.onEvtArrived(L2CharacterAI.java:641)
    at net.sf.l2j.gameserver.ai.AbstractAI.notifyEvent(AbstractAI.java:373)
    at net.sf.l2j.gameserver.ai.AbstractAI.notifyEvent(AbstractAI.java:296)

    at net.sf.l2j.gameserver.model.actor.L2Character.moveToLocation(L2Character.java:3586)
    at net.sf.l2j.gameserver.model.actor.L2Character$AIAccessor.moveTo(L2Character.java:2819)
    at net.sf.l2j.gameserver.ai.AbstractAI.moveTo(AbstractAI.java:538)
    at net.sf.l2j.gameserver.ai.AbstractAI.moveToPawn(AbstractAI.java:494)
    at net.sf.l2j.gameserver.ai.L2CharacterAI.maybeMoveToPawn(L2CharacterAI.java:877)
    at net.sf.l2j.gameserver.ai.L2PlayerAI.thinkCast(L2PlayerAI.java:235)
    at net.sf.l2j.gameserver.ai.L2PlayerAI.onEvtThink(L2PlayerAI.java:312)
    at net.sf.l2j.gameserver.ai.L2CharacterAI.onEvtArrived(L2CharacterAI.java:641)
    at net.sf.l2j.gameserver.ai.AbstractAI.notifyEvent(AbstractAI.java:373)
    at net.sf.l2j.gameserver.ai.AbstractAI.notifyEvent(AbstractAI.java:296)

and 100 same error like last block

L2Character.java:3586 i marked it with plus "+"

....
if (offset > 0 || distance < 1)
		{
			// approximation for moving closer when z coordinates are different
			// TODO: handle Z axis movement better
			offset -= Math.abs(dz);
			if (offset < 5)
				offset = 5;
			
			// If no distance to go through, the movement is canceled
			if (distance < 1 || distance - offset <= 0)
			{
				if (Config.DEBUG)
					_log.fine("already in range, no movement needed.");
				
				// Notify the AI that the L2Character is arrived at destination
+				getAI().notifyEvent(CtrlEvent.EVT_ARRIVED);
				
				return;
			}
....

L2Character.java:2819

		public void moveTo(int x, int y, int z, int offset)
		{
+			moveToLocation(x, y, z, offset);
		}

AbstractAI.java:538

protected void moveTo(int x, int y, int z, int offset)
	{
		// Check if actor can move
		if (_actor.isMovementDisabled())
		{
			_actor.sendPacket(ActionFailed.STATIC_PACKET);
			return;
		}
		
		// Set AI movement data
		_clientMoving = true;
		
		if (_accessor == null)
			return;
		
		// Calculate movement data for a move to location action and add the actor to 
+		_accessor.moveTo(x, y, z, offset);
		
		if (!_actor.isMoving())
		{
			_actor.sendPacket(ActionFailed.STATIC_PACKET);
			return;
		}
		
		// Send a Server->Client packet CharMoveToLocation to the actor and all L2PcInstance in
		_actor.broadcastPacket(new MoveToLocation(_actor));
	}

AbstractAI.java:494

	protected void moveToPawn(L2Object pawn, int offset)
	{
		if (_clientMoving && _target == pawn && _actor.isOnGeodataPath() && GameTimeController.getGameTicks() < _moveToPawnTimeout)
			return;
		
		_target = pawn;
		if (_target == null)
			return;
		
		_moveToPawnTimeout = GameTimeController.getGameTicks() + 20;
		
+		moveTo(_target.getX(), _target.getY(), _target.getZ(), offset = offset < 10 ? 10 : offset);
		
	}

L2CharacterAI.java:877

protected boolean maybeMoveToPawn(L2Object target, int offset)
	{
		if (target == null || offset < 0) // skill radius -1
			return false;
		
		offset += _actor.getTemplate().getCollisionRadius();
		if (target instanceof L2Character)
			offset += ((L2Character) target).getTemplate().getCollisionRadius();
		
		if (!_actor.isInsideRadius(target, offset, false, false))
		{
			if (getFollowTarget() != null)
			{
				int foffset = offset + (((L2Character) target).isMoving() ? 100 : 0);
				
				// allow larger hit range when the target is moving (check is run only once per second)
				if (!_actor.isInsideRadius(target, foffset, false, false))
				{
					if (!_actor.isAttackingNow() || _actor instanceof L2Summon)
+						moveToPawn(target, offset);
					
					return true;
				}
				
				stopFollow();
				return false;
			}
			
			if (_actor.isMovementDisabled() && !(_actor instanceof L2Attackable))
			{
				if (getIntention() == CtrlIntention.ATTACK)
					setIntention(CtrlIntention.IDLE);
				
				return true;
			}
			
			// If not running, set the L2Character movement type to run and send Server->Client packet ChangeMoveType to all others L2PcInstance
			if (!(this instanceof L2PlayerAI) && !(this instanceof L2SummonAI))
				_actor.setRunning();
			
			if ((target instanceof L2Character) && !(target instanceof L2DoorInstance))
				startFollow((L2Character) target, offset);
			else
			{
				// Move the actor to Pawn server side AND client side by sending Server->Client packet MoveToPawn (broadcast)
				moveToPawn(target, offset);
			}
			return true;
		}
		
		stopFollow();
		return false;
	}

L2PlayerAI.java:235

	private void thinkCast()
	{
		L2Character target = (L2Character) getTarget();
		if (Config.DEBUG)
			_log.warning("L2PlayerAI: thinkCast -> Start");
		
		if (_skill.getTargetType() == SkillTargetType.TARGET_GROUND && _actor instanceof L2PcInstance)
		{
			if (maybeMoveToPosition(((L2PcInstance) _actor).getCurrentSkillWorldPosition(), _skill.getCastRange()))
			{
				_actor.setIsCastingNow(false);
				return;
			}
		}
		else
		{
			if (checkTargetLost(target))
			{
				// Notify the target
				if (_skill.isOffensive() && getTarget() != null)
					setTarget(null);
				
				_actor.setIsCastingNow(false);
				return;
			}
			
+			if (target != null && maybeMoveToPawn(target, _skill.getCastRange()))
			{
				_actor.setIsCastingNow(false);
				return;
			}
		}

L2PlayerAI.java:312

protected void onEvtThink()
	{
		// Check if the actor can't use skills and if a thinking action isn't already in progress
		if (_thinking && getIntention() != CtrlIntention.CAST) // casting must always continue
			return;
		
		// Start thinking action
		_thinking = true;
		
		try
		{
			// Manage AI thoughts
			switch (getIntention())
			{
				case ATTACK:
					thinkAttack();
					break;
				case CAST:
+					thinkCast();
					break;
				case PICK_UP:
					thinkPickUp();
					break;
				case INTERACT:
					thinkInteract();
					break;
			}
		}
		finally
		{
			// Stop thinking action
			_thinking = false;
		}
	}

L2CharacterAI.java:641

	protected void onEvtArrived()
	{
		_accessor.getActor().revalidateZone(true);
		
		if (_accessor.getActor().moveToNextRoutePoint())
			return;
		
		if (_accessor.getActor() instanceof L2Attackable)
			((L2Attackable) _accessor.getActor()).setIsReturningToSpawnPoint(false);
		
		clientStoppedMoving();
		
		// If the Intention was MOVE_TO, set the Intention to ACTIVE
		if (getIntention() == CtrlIntention.MOVE_TO)
			setIntention(CtrlIntention.ACTIVE);
		
		// Launch actions corresponding to the Event Think
+		onEvtThink();
	}

AbstractAI.java:373

...
			case EVT_ARRIVED:
				if (!_actor.isCastingNow() && !_actor.isCastingSimultaneouslyNow())
+					onEvtArrived();
				break;
...

AbstractAI.java:296

	public final void notifyEvent(CtrlEvent evt)
	{
+		notifyEvent(evt, null, null);
	}

i get this error not only with startWaterTask i get and with others, and same error 14000 lines... one time per day.

 

Maybe anyone know how to solve this problem?
 

Recommended Posts

  • 0
Posted

The stackoverflow is a bug plaguing any aCis since at least 2y, it has been fixed with revert of movement system back to L2J.

from what revision i can fix it?

  • 0
Posted (edited)

Read changesets ;p. It's not 10 revisions old.

Yes.. i read all chagelog from me revision to latest and see many chages... Time to move all features to latest version, will be hard..

Edited by wongerlt
  • 0
Posted

Yes.. i read all chagelog from me revision to latest and see many chages... Time to move all features to latest version, will be hard..

Just a little addapt and is ok :D

  • 0
Posted

Little? I'm many things changed in server core , so move all changes is hard :D

Thats why people use svn :D you can save your work even with a patch

  • 0
Posted

Still progress is not lost. Take clean pack, the same revision, create SVN, replace with your actual sources and boom, you have diff patch with all your changes :)

  • 0
Posted

Im use only notepad++ and ant (to compile). Im try to use eclipse but its very uncomfortable for me :/

And i see on latest version many changes, so i need rework all me codes to adapt ;)

Will be a lot of work from ~300 to ~360 :D

  • 0
Posted (edited)

To much work to move all server to new aCis version... Maybe anyone can tell me more about this movement system bug. Thanks :)

Example about bug that need target self to can move at start, but not all time.

Edited by wongerlt

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

    • L2OSIRIS: REBORN — The only L2OFF Interlude low-rate server active in 2026.   Not an emulator. Every other Interlude server running right now uses L2J (Java reimplementation). We run on original NCSoft L2Server and CachedServer binaries — true L2OFF C6 architecture.   Rates: EXP/SP x7 | Adena x5 | Drop x3 Chronicle: Interlude (C6) Open Beta: Aug 22 – Sep 4, 2026 Grand Opening: September 5, 2026   Features: - NPC Buffer - Global Gatekeeper - Offline Private Stores - No Pay-to-Win - No Custom Weapons or Armor - Safe Enchant +3, Max +16 - Working petition system - Max 2 game windows   Website: https://l2osiris.com Discord: https://discord.gg/5KhGxA92za
    • Knowing where to loot, which perks to equip, and how long to stay in a match before extracting are the core principles of earning Gyldenblod in Mistfall Hunter. Depending on how aggressively you play and whether you engage bosses, a well‑optimized run can yield anywhere from 9,000 to 20,000 Gyldenblod.   Using the Rat Kit for Safe, Consistent Income Running the Rat Kit remains the most reliable and secure method of farming Gyldenblod. Once equipped, simply roam the map and collect objects that can be sold. Your goal is to avoid PvP encounters while looting every chest, interactable, and side quest along the outer edges of the map. A clean Rat Kit run consistently earns around 9,000 Gyldenblod. Boosting Earnings Through Perks & Interactables Look for perks that increase your income or improve survivability—such as no fall damage. Looting interactables scattered across the map, including Sacred Heart Trees, is one of the most overlooked ways to make money. These interactables often contain up to two items, including purple, yellow, or even red rarity drops. A full run of basic looting may be worth less than a single interactable containing two legendary items. Boss Interaction for High‑Risk, High‑Reward Runs Engaging bosses during a run dramatically increases your potential earnings—especially if you’re equipped with purple or better gear and have sufficient experience. A pure looting run without bosses typically nets about 9,000 Gyldenblod, but defeating a boss can raise that total to 20,000 Gyldenblod or more. However, because failing a boss fight can result in losing all your money, it’s not recommended for early‑game players. Looting Fallen Players Always loot the bodies of fallen players you encounter. Gear and items remain on players killed by PvP or environmental hazards. Checking takes only a few seconds, and you may find valuable purple items that improve your loadout or increase your earnings. Tower Side Quests for Efficient Exploration Tower side quests are one of the best ways to explore Mistfall Hunter. They consistently send you to a different tower than where you started, allowing you to pass through multiple loot zones and collect more items to trade for Gyldenblod. Additional Effective Ways to Earn Gyldenblod Event Zones — Temporary hotspots often contain boosted loot tables, rare drops, and higher‑value interactables. High‑Tier Enemy Farming — Certain elite enemies drop valuable crafting materials and sellable items. With strong gear, this becomes a repeatable income source. Daily & Weekly Contracts — Completing Hunter Contracts provides guaranteed Gyldenblod payouts and bonus rewards. Trading High‑Demand Materials — Some crafting materials have high resale value. Farming them in specific biomes can be more profitable than general looting. Extraction Timing Optimization — Staying slightly longer in a match to hit one more loot zone or interactable can significantly increase your Gyldenblod per run. Squad Coordination — Running with teammates allows you to clear zones faster, share information, and safely loot high‑value areas. Map Rotation Knowledge — Learning which maps have the best interactable density helps you prioritize runs that yield higher average Gyldenblod. Buying from the Third Party - If you don’t want to spend hours farming Gyldenblod in Mistfall Hunter, you can get fast, affordable, and reliable Gyldenblod directly from MmoGah. Our Mistfall Hunter Gyldenblod service is now available, offering quick delivery and great prices so you can focus on enjoying the game instead of grinding.   Conclusion Farming Gyldenblod efficiently in Mistfall Hunter comes down to smart routing, risk management, and maximizing every loot opportunity. Whether you prefer safe Rat Kit runs or high‑risk boss engagements, understanding the map’s interactables, perks, and side quests will dramatically increase your income. Combine these strategies with event zones, contracts, and elite enemy farming, and you’ll consistently earn Gyldenblod at top speed.
  • Topics

×
×
  • Create New...

Important Information

This community uses essential cookies to function properly. Non-essential cookies and third-party services are used only with your consent. Read our Privacy Policy and We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue..