Jump to content
  • 0

Anit Afk In Zone Multifunction


Question

Posted

I wanted to buy anti afk but no one wanted it to do, so i tried by myself and i have it working good with errors. if i am to long afk in zone server kick me.

here it is:

package custom.AntiAfk;

import java.util.ArrayList;
import java.util.logging.Logger;

import com.l2jserver.gameserver.ThreadPoolManager;
import com.l2jserver.gameserver.instancemanager.ZoneManager;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.zone.L2ZoneType;

/** 
 *
 * @author Phear3d
 */

public class AntiAfkTvt
{
   

    private final int CheckDelay = 60000;   
    private static Logger _log = Logger.getLogger(AntiAfkTvt.class.getName());
	private static ArrayList<String> PlayersInZone = new ArrayList<String>();
	private static String[] Splitter;
	private static int xx,yy,zz,SameLoc;
	private static L2PcInstance _player;

   private AntiAfkTvt()
   {
       _log.info("AntiAfkTvt: Auto-Kick AFK in TVT System initiated.");
       ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new AntiAfk(), 60000, CheckDelay);
   }

   private class AntiAfk implements Runnable
   {
	   @SuppressWarnings("deprecation")
	   public void run()
	   {    		  
     		 for (L2ZoneType zone : ZoneManager.getInstance().getAllZones())
     			if (zone.getId() == 70006)
     			
     			 for (L2Character character : zone.getCharactersInside().values())
     			  {
     				if (character instanceof L2PcInstance && (!((L2PcInstance) character).getClient().isDetached()))
     				  {
     					  _player = (L2PcInstance)character;
     					  AddSpawnInfo(_player.getName(),_player.getX(),_player.getY(),_player.getZ());
     					  
     				  }
     			  }
     		  
     	  }
     	  
       
   }

	private static void AddSpawnInfo(String name, int _x, int _y, int _z)
	{
		if(!CheckSpawnInfo(name))
		{
			String temp = name + ":" + Integer.toString(_x) + ":" + Integer.toString(_y) + ":" + Integer.toString(_z) + ":1";
			PlayersInZone.add(temp);
		}
		else
		{
	        Object[] elements = PlayersInZone.toArray();
	        for(int i=0; i < elements.length ; i++)
	        {
	        	Splitter = ((String) elements[i]).split(":");
	        	String nameVal = Splitter[0];
			       if (name.equals(nameVal))
			       {
			    	   GetSpawnInfo(name);
			    	   if (_x == xx && _y == yy && _z == zz && _player.isAttackingNow() == false && _player.isCastingNow() == false && _player.isOnline() == true)
			    	   {
			    		   ++SameLoc;
			    		   if (SameLoc >= 2)//Kick after 4 same x/y/z, location checks
			    		   {
			    			   //kick here
			    			   
			    			   _player.logout();
			    			   return;
			    		   }
			    		   else
			    		   {
			    			   PlayersInZone.remove(i);
			    			   String temp = name + ":" + Integer.toString(_x) + ":" + Integer.toString(_y) + ":" + Integer.toString(_z) + ":" + SameLoc;
			    			   PlayersInZone.add(temp);
			    			   return;
			    		   }
			    	   }
			    	   PlayersInZone.remove(i);
					   String temp = name + ":" + Integer.toString(_x) + ":" + Integer.toString(_y) + ":" + Integer.toString(_z) + ":1";
					   PlayersInZone.add(temp);
			       }
	        }
		}
	}
	
	private static boolean CheckSpawnInfo(String name)
	{
		
        Object[] elements = PlayersInZone.toArray();
        for(int i=0; i < elements.length ; i++)
        {
        	Splitter = ((String) elements[i]).split(":");
        	String nameVal = Splitter[0];
		       if (name.equals(nameVal))
		       {
			       return true;
		       }
        }
        return false;
	}
	
	private static void GetSpawnInfo(String name)
	{
		
        Object[] elements = PlayersInZone.toArray();
        for(int i=0; i < elements.length ; i++)
        {
        	Splitter = ((String) elements[i]).split(":");
        	String nameVal = Splitter[0];
		       if (name.equals(nameVal))
		       {
			       xx = Integer.parseInt(Splitter[1]);
			       yy = Integer.parseInt(Splitter[2]);
			       zz = Integer.parseInt(Splitter[3]);
			       SameLoc = Integer.parseInt(Splitter[4]);
		       }
        }
	}

   public static AntiAfkTvt getInstance()
   {
       return SingletonHolder._instance;
   }

   @SuppressWarnings("synthetic-access")
   private static class SingletonHolder
   {
       protected static final AntiAfkTvt _instance = new AntiAfkTvt();
   }

   public static void main(String[] args)
   {
	   AntiAfkTvt.getInstance();
   }
}

and error in gs:

Exception in thread "GeneralSTPool-8" java.lang.ClassCastException: com.l2jserve
r.gameserver.model.actor.instance.L2MonsterInstance cannot be cast to com.l2jser
ver.gameserver.model.actor.instance.L2PcInstance
        at custom.AntiAfk.AntiAfkTvt$AntiAfk.run(AntiAfkTvt.java:48)
        at com.l2jserver.gameserver.ThreadPoolManager$RunnableWrapper.run(Thread
PoolManager.java:87)
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
        at java.util.concurrent.FutureTask.runAndReset(Unknown Source)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.
access$301(Unknown Source)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.
run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

3 answers to this question

Recommended Posts

  • 0
Posted (edited)

That PlayersInZone performance must be really, really sad (List, than Array, than add/remove, then create String and split the string to retrive informations... Consider to use a ConcurentHashMap. If 10 players are in the area, I guess you will end with ridiculous amount of errors. Your code is wrong on many levels.

 

I can't explain the CastException though, you got the correct instanceof check.

Map<Integer, Location> = new ConcurrentHashMap<>();

Integer : the player object id.

Location : stored informations under X/Y/Z.

 

.get( to retrieve the value.

.put( to add or update an entry.

.remove( to delete.

 

Concurrent type to allow concurrent add/remove in same time, otherwise your screwed.

 

And drop that _player variable.

Edited by Tryskell
  • 0
Posted

I guess that would be better to use System.currentTimeMillis(), check if you did any action or not, if not - kick lol @ the x/y/z check :P

  • 0
Posted

The author of this code is 

/** 
 *
 * @author Phear3d
 */

i only replaced tvt players with player in zone. So you say that code is not good idea to put in live server even if i remove errors?

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...