Index: java/com/l2jserver/gameserver/model/actor/L2Character.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/L2Character.java (revision 2)
+++ java/com/l2jserver/gameserver/model/actor/L2Character.java (working copy)
/**
* Mother class of all character objects of the world (PC, NPC...)<br>
* L2Character:<br>
@@ -4420,6 +4420,11 @@
final int curY = super.getY();
final int curZ = super.getZ();
+ if (isPlayer())
+ {
+ getActingPlayer().setLastXY(curX, curY);
+ }
+
// Calculate distance (dx,dy) between current position and destination
// TODO: improve Z axis move/follow support when dx,dy are small compared to dz
double dx = (x - curX);
Index: java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java (revision 2)
+++ java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java (working copy)
@@ -14483,4 +14514,47 @@
return _hasCharmOfCourage;
}
+
+ final int[] _lastXY = new int[2];
+
+ public void setLastXY(int x, int y)
+ {
+ _lastXY[0] = x;
+ _lastXY[1] = y;
+ }
+
+ public boolean isAfk()
+ {
+ return (getX() == _lastXY[0]) && (getY() == _lastXY[1]);
+ }
+
+ /** Methods to put inside your event when it start and it stop */
+
+ Future<?> _task;
+
+ public void stopAfk()
+ {
+ if (_task != null)
+ {
+ _task.cancel(true);
+ _task = null;
+ }
+ }
+
+ public void startAfk()
+ {
+ stopAfk();
+
+ _task = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(() ->
+ {
+ L2World.getInstance().getPlayers().stream().filter(p -> p.isAfk()).forEach(p ->
+ {
+ p.sendMessage("You have been detected as afk.");
+ // Tasks here.
+ });
+
+ }, 60000, 60000);
+ }
}
\ No newline at end of file
I made you a short code that you can use.
*Note: Make sure to put your boolean method or what you have that checks if player is inside event. Ex. p -> p.isAfk() && p.isInEvent()