Jump to content

Recommended Posts

Posted

this as a temporary solution for L2j-Killer

fix this, [c]DS

Index: java/com/l2jserver/gameserver/GameServer.java
===================================================================
--- java/com/l2jserver/gameserver/GameServer.java	(revision 3728)
+++ java/com/l2jserver/gameserver/GameServer.java	(working copy)
@@ -437,7 +437,7 @@
		sc.HELPER_BUFFER_COUNT = Config.MMO_HELPER_BUFFER_COUNT;

		final L2GamePacketHandler gph = new L2GamePacketHandler();
-		_selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, null);
+		_selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, gph);

		InetAddress bindAddress = null;
		if (!Config.GAMESERVER_HOSTNAME.equals("*"))
Index: java/com/l2jserver/gameserver/network/L2GamePacketHandler.java
===================================================================
--- java/com/l2jserver/gameserver/network/L2GamePacketHandler.java	(revision 3728)
+++ java/com/l2jserver/gameserver/network/L2GamePacketHandler.java	(working copy)
@@ -14,11 +14,15 @@
  */
package com.l2jserver.gameserver.network;

+import java.net.InetAddress;
import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+import java.util.HashMap;
import java.util.concurrent.RejectedExecutionException;
import java.util.logging.Logger;


+import org.mmocore.network.IAcceptFilter;
import org.mmocore.network.IClientFactory;
import org.mmocore.network.IMMOExecutor;
import org.mmocore.network.IPacketHandler;
@@ -29,6 +33,8 @@
import com.l2jserver.gameserver.ThreadPoolManager;
import com.l2jserver.gameserver.network.L2GameClient.GameClientState;
import com.l2jserver.gameserver.network.clientpackets.*;
+import com.l2jserver.loginserver.SelectorHelper;
+import com.l2jserver.loginserver.SelectorHelper.Flood;
import com.l2jserver.util.Util;

/**
@@ -40,9 +46,10 @@
  * Note: If for a given exception a packet needs to be handled on more then one state, then it should be added to all these states.
  * @author  KenM
  */
-public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>, IClientFactory<L2GameClient>, IMMOExecutor<L2GameClient>
+public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>, IClientFactory<L2GameClient>, IMMOExecutor<L2GameClient>, IAcceptFilter
{
     private static final Logger _log = Logger.getLogger(L2GamePacketHandler.class.getName());
+    private final HashMap<Integer, Flood> _ipFloodMap = new HashMap<Integer, Flood>();

	// implementation
	public ReceivablePacket<L2GameClient> handlePacket(ByteBuffer buf, L2GameClient client)
@@ -1130,4 +1137,52 @@
			}
		}
	}
+
+	@Override
+	public boolean accept(SocketChannel sc)
+	{
+		InetAddress addr = sc.socket().getInetAddress();
+		int h = SelectorHelper.hash(addr.getAddress());
+		
+		long current = System.currentTimeMillis();
+		Flood f;
+		synchronized (_ipFloodMap)
+		{
+			f = _ipFloodMap.get(h);
+		}
+		if (f != null)
+		{
+			if (f.trys == -1)
+			{
+				f.lastAccess = current;
+				return false;
+			}
+			
+			if (f.lastAccess + 1000 > current)
+			{
+				f.lastAccess = current;
+				
+				if (f.trys >= 3)
+				{
+					f.trys = -1;
+					return false;
+				}
+				
+				f.trys++;
+			}
+			else
+			{
+				f.lastAccess = current;
+			}
+		}
+		else
+		{
+			synchronized (_ipFloodMap)
+			{
+				_ipFloodMap.put(h, new Flood());
+			}
+		}
+		
+		return true;
+	}
}
Index: java/com/l2jserver/loginserver/SelectorHelper.java
===================================================================
--- java/com/l2jserver/loginserver/SelectorHelper.java	(revision 3728)
+++ java/com/l2jserver/loginserver/SelectorHelper.java	(working copy)
@@ -123,18 +123,18 @@
	 * @param ip
	 * @return
	 */
-	private int hash(byte[] ip)
+	public static int hash(byte[] ip)
	{
		return ip[0] & 0xFF | ip[1] << 8 & 0xFF00 | ip[2] << 16 & 0xFF0000 | ip[3] << 24
		        & 0xFF000000;
	}

-	private class Flood
+	public static class Flood
	{
-		long lastAccess;
-		int trys;
+		public long lastAccess;
+		public int trys;

-		Flood()
+		public Flood()
		{
			lastAccess = System.currentTimeMillis();
			trys = 0;

Posted

And GoodT knew that??

 

He has probably used it?

Instead of trolling everybody, just thank the author.

 

Anyway, I think that these shares should stay out of mxc ^^

More dead servers = less Lineage ][ Destruction.

 

Thanks for the share tho.

Posted

patch works fine, but i added here also the removal of expired "bans", because without it, the IP could not login till gameserver restart (bad for LAN house..)

Index: java/com/l2jserver/gameserver/GameServer.java
===================================================================
--- java/com/l2jserver/gameserver/GameServer.java	(revision 3703)
+++ java/com/l2jserver/gameserver/GameServer.java	(working copy)
@@ -437,7 +437,7 @@
		sc.HELPER_BUFFER_COUNT = Config.MMO_HELPER_BUFFER_COUNT;

		final L2GamePacketHandler gph = new L2GamePacketHandler();
-		_selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, null);
+		_selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, gph);

		InetAddress bindAddress = null;
		if (!Config.GAMESERVER_HOSTNAME.equals("*"))
Index: java/com/l2jserver/gameserver/network/L2GamePacketHandler.java
===================================================================
--- java/com/l2jserver/gameserver/network/L2GamePacketHandler.java	(revision 3703)
+++ java/com/l2jserver/gameserver/network/L2GamePacketHandler.java	(working copy)
@@ -14,11 +14,17 @@
  */
package com.l2jserver.gameserver.network;

+import java.net.InetAddress;
import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map.Entry;
import java.util.concurrent.RejectedExecutionException;
import java.util.logging.Logger;


+import org.mmocore.network.IAcceptFilter;
import org.mmocore.network.IClientFactory;
import org.mmocore.network.IMMOExecutor;
import org.mmocore.network.IPacketHandler;
@@ -29,6 +35,8 @@
import com.l2jserver.gameserver.ThreadPoolManager;
import com.l2jserver.gameserver.network.L2GameClient.GameClientState;
import com.l2jserver.gameserver.network.clientpackets.*;
+import com.l2jserver.loginserver.SelectorHelper;
+import com.l2jserver.loginserver.SelectorHelper.Flood;
import com.l2jserver.util.Util;

/**
@@ -40,9 +48,51 @@
  * Note: If for a given exception a packet needs to be handled on more then one state, then it should be added to all these states.
  * @author  KenM
  */
-public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>, IClientFactory<L2GameClient>, IMMOExecutor<L2GameClient>
+public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>, IClientFactory<L2GameClient>, IMMOExecutor<L2GameClient>, IAcceptFilter
{
     private static final Logger _log = Logger.getLogger(L2GamePacketHandler.class.getName());
+    private final HashMap<Integer, Flood> _ipFloodMap = new HashMap<Integer, Flood>();
+    
+	public L2GamePacketHandler()
+	{
+		super();
+		Thread cleanUpIpFloodMap = new Thread()
+		{
+			public void run()
+			{
+				while (true)
+				{
+					long reference = System.currentTimeMillis() - (1000 * 300);
+					ArrayList<Integer> toRemove = new ArrayList<Integer>();
+					synchronized (_ipFloodMap)
+					{
+						for (Entry<Integer, Flood> e : _ipFloodMap.entrySet())
+						{
+							Flood f = e.getValue();
+							if (f.lastAccess < reference)
+								toRemove.add(e.getKey());
+						}
+					}
+					
+					synchronized (_ipFloodMap)
+					{
+						_ipFloodMap.keySet().removeAll(toRemove);
+					}
+					
+					try
+					{
+						Thread.sleep(5000);
+					}
+					catch (InterruptedException e)
+					{
+						
+					}
+				}
+			}
+		};
+		cleanUpIpFloodMap.setDaemon(true);
+		cleanUpIpFloodMap.start();
+	}

	// implementation
	public ReceivablePacket<L2GameClient> handlePacket(ByteBuffer buf, L2GameClient client)
@@ -1130,4 +1180,52 @@
			}
		}
	}
+
+	@Override
+	public boolean accept(SocketChannel sc)
+	{
+		InetAddress addr = sc.socket().getInetAddress();
+		int h = SelectorHelper.hash(addr.getAddress());
+		
+		long current = System.currentTimeMillis();
+		Flood f;
+		synchronized (_ipFloodMap)
+		{
+			f = _ipFloodMap.get(h);
+		}
+		if (f != null)
+		{
+			if (f.trys == -1)
+			{
+				f.lastAccess = current;
+				return false;
+			}
+			
+			if (f.lastAccess + 1000 > current)
+			{
+				f.lastAccess = current;
+				
+				if (f.trys >= 3)
+				{
+					f.trys = -1;
+					return false;
+				}
+				
+				f.trys++;
+			}
+			else
+			{
+				f.lastAccess = current;
+			}
+		}
+		else
+		{
+			synchronized (_ipFloodMap)
+			{
+				_ipFloodMap.put(h, new Flood());
+			}
+		}
+		
+		return true;
+	}
}
Index: java/com/l2jserver/loginserver/SelectorHelper.java
===================================================================
--- java/com/l2jserver/loginserver/SelectorHelper.java	(revision 3703)
+++ java/com/l2jserver/loginserver/SelectorHelper.java	(working copy)
@@ -34,8 +34,7 @@
  * 
  * @author KenM
  */
-public class SelectorHelper extends Thread implements IMMOExecutor<L2LoginClient>,
-        IClientFactory<L2LoginClient>, IAcceptFilter
+public class SelectorHelper extends Thread implements IMMOExecutor<L2LoginClient>, IClientFactory<L2LoginClient>, IAcceptFilter
{
	private HashMap<Integer, Flood> _ipFloodMap;
	private ThreadPoolExecutor _generalPacketsThreadPool;
@@ -123,18 +122,17 @@
	 * @param ip
	 * @return
	 */
-	private int hash(byte[] ip)
+	public static int hash(byte[] ip)
	{
-		return ip[0] & 0xFF | ip[1] << 8 & 0xFF00 | ip[2] << 16 & 0xFF0000 | ip[3] << 24
-		        & 0xFF000000;
+		return ip[0] & 0xFF | ip[1] << 8 & 0xFF00 | ip[2] << 16 & 0xFF0000 | ip[3] << 24 & 0xFF000000;
	}

-	private class Flood
+	public static class Flood
	{
-		long lastAccess;
-		int trys;
+		public long lastAccess;
+		public int trys;

-		Flood()
+		public Flood()
		{
			lastAccess = System.currentTimeMillis();
			trys = 0;
@@ -151,7 +149,7 @@
		while (true)
		{
			long reference = System.currentTimeMillis() - (1000 * 300);
-			ArrayList<Integer> toRemove = new ArrayList<Integer>(50);
+			ArrayList<Integer> toRemove = new ArrayList<Integer>();
			synchronized (_ipFloodMap)
			{
				for (Entry<Integer, Flood> e : _ipFloodMap.entrySet())
@@ -164,10 +162,7 @@

			synchronized (_ipFloodMap)
			{
-				for (Integer i : toRemove)
-				{
-					_ipFloodMap.remove(i);
-				}
+				_ipFloodMap.keySet().removeAll(toRemove);
			}

			try

[c]DrHouse and janiii

Posted

I can't really see the commit at l2jserver timeline. I might be blind =/

who said they commited it anyway? its a temp fix that drhouse posted on l2j forums.. maybe it doesnt even work (well it should since its drhouse's but nobody seems have tested it.. least nobody posted some feedback)

Posted

I dont know, why a lot of users spam this forum, with "GoodT thx to L2JServer". Omg, its my thing and DāЯқŜiĐє you stop spam. You have 1k post? I think, how you have it.

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

    • what pack you use  send me on discord for it
    • package custom.events.RandomZoneEvent; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.ScheduledFuture; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.time.SchedulingPattern; import org.l2jmobius.commons.time.TimeUtil; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.gameserver.managers.ZoneManager; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.quest.Event; import org.l2jmobius.gameserver.model.zone.ZoneId; import org.l2jmobius.gameserver.model.zone.ZoneType; import org.l2jmobius.gameserver.model.zone.type.RandomZone; import org.l2jmobius.gameserver.util.Broadcast; /** * Random Zone Event - Activates one random PvP zone temporarily. No modifica la clase de la zona: usa flags PvP en runtime. * @author Juan */ public class RandomZoneEvent extends Event { private static final String CONFIG_FILE = "data/scripts/custom/events/RandomZoneEvent/config.xml"; private static int EVENT_DURATION_MINUTES = 15; private static boolean _isActive = false; private ScheduledFuture<?> _eventTask = null; private final List<ZoneType> _availableZones = new ArrayList<>(); private ZoneType _activeZone = null; public RandomZoneEvent() { loadConfig(); loadZones(); registerZoneListeners(); } /** * Registra listeners a TODAS LAS ZONAS random */ private void registerZoneListeners() { for (ZoneType zone : _availableZones) { addEnterZoneId(zone.getId()); addExitZoneId(zone.getId()); LOGGER.info("[RandomZoneEvent] Registered listener for zone: " + zone.getName()); } } private void loadConfig() { new IXmlReader() { @Override public void load() { parseDatapackFile(CONFIG_FILE); } @Override public void parseDocument(Document doc, File file) { forEach(doc, "event", eventNode -> { final StatSet att = new StatSet(parseAttributes(eventNode)); final String name = att.getString("name"); for (Node node = eventNode.getFirstChild(); node != null; node = node.getNextSibling()) { if ("schedule".equals(node.getNodeName())) { final StatSet attributes = new StatSet(parseAttributes(node)); final String pattern = attributes.getString("pattern"); final SchedulingPattern schedulingPattern = new SchedulingPattern(pattern); final StatSet params = new StatSet(); params.set("Name", name); params.set("SchedulingPattern", pattern); final long delay = schedulingPattern.getDelayToNextFromNow(); getTimers().addTimer("Schedule_" + name, params, delay + 5000, null, null); LOGGER.info("[RandomZoneEvent] Event " + name + " scheduled at " + TimeUtil.getDateTimeString(System.currentTimeMillis() + delay)); } } }); } }.load(); } private void loadZones() { for (ZoneType zone : ZoneManager.getInstance().getAllZones(RandomZone.class)) { if ((zone.getName() != null) && zone.getName().toLowerCase().startsWith("random_zone")) { _availableZones.add(zone); LOGGER.info("[RandomZoneEvent] Loaded zone: " + zone.getName() + " (id=" + zone.getId() + ")"); } } LOGGER.info("[RandomZoneEvent] Total random zones loaded: " + _availableZones.size()); } @Override public void onTimerEvent(String event, StatSet params, Npc npc, Player player) { if (event.startsWith("Schedule_")) { eventStart(null); final SchedulingPattern schedulingPattern = new SchedulingPattern(params.getString("SchedulingPattern")); final long delay = schedulingPattern.getDelayToNextFromNow(); getTimers().addTimer(event, params, delay + 5000, null, null); LOGGER.info("[RandomZoneEvent] Rescheduled for " + TimeUtil.getDateTimeString(System.currentTimeMillis() + delay)); } } @Override public boolean eventStart(Player eventMaker) { if (_isActive) { if (eventMaker != null) { eventMaker.sendMessage("RandomZoneEvent already active."); } return false; } if (_availableZones.isEmpty()) { Broadcast.toAllOnlinePlayers("[RandomZoneEvent] No zones configured."); return false; } _isActive = true; Broadcast.toAllOnlinePlayers("⚔️ Random Zone Event has started!"); _eventTask = ThreadPool.schedule(this::activateRandomZone, 5_000); return true; } private void activateRandomZone() { _activeZone = _availableZones.get(new Random().nextInt(_availableZones.size())); _activeZone.setEnabled(true); Broadcast.toAllOnlinePlayers("🔥 Random Zone Event: " + _activeZone.getName() + " is now PvP for " + EVENT_DURATION_MINUTES + " minutes!"); _eventTask = ThreadPool.schedule(this::eventStop, EVENT_DURATION_MINUTES * 60 * 1000L); } @Override public boolean eventStop() { if (!_isActive) { return false; } _isActive = false; if (_eventTask != null) { _eventTask.cancel(true); _eventTask = null; } if (_activeZone != null) { _activeZone.setEnabled(false); Broadcast.toAllOnlinePlayers("🏁 Random Zone Event ended. " + _activeZone.getName() + " is back to normal."); _activeZone = null; } else { Broadcast.toAllOnlinePlayers("🏁 Random Zone Event ended."); } return true; } @Override public void onEnterZone(Creature creature, ZoneType zone) { if (!_isActive || (_activeZone == null)) { return; } if ((zone == _activeZone) && creature.isPlayable()) { creature.setInsideZone(ZoneId.PVP, true); if (creature.isPlayer()) { creature.sendMessage("Esta zona está en modo PvP temporalmente."); } } } @Override public void onExitZone(Creature creature, ZoneType zone) { if (!_isActive || (_activeZone == null)) { return; } if ((zone == _activeZone) && creature.isPlayable()) { creature.setInsideZone(ZoneId.PVP, false); if (creature.isPlayer()) { creature.sendMessage("Abandonaste la zona PvP temporal."); } } } @Override public boolean eventBypass(Player player, String bypass) { return true; } @Override public String onEvent(String event, Npc npc, Player player) { return super.onEvent(event, npc, player); } @Override public String onFirstTalk(Npc npc, Player player) { return null; } public static void main(String[] args) { new RandomZoneEvent(); } } i have this but its not working
    • ZonePvPSpawnBossRadio=0 ZonePvPSpawnBossBarakiel=0 at the Customs.ini in L2Server folder. Im prety sure this is it because i had the same problem with you in cruma 1 floor for example and i couldn't fix it but i fixed it finally by changing these 2 lines
    • Siege Reward Start PM Msg Rework Config root BossDieAnnounce and BossDieSound in the L24Team.properties and Config.java files for global raid boss death notifications and sounds. Adds a new reward_list table to the DB.sql file to track castle rewards. Improves character creation logic for thread safety and validation. Adds extensive state checks to the RequestEnchantItem method to prevent enchantments during inappropriate player states. Fixed auto-attack animation bug (there was no attack animation, only damage animation) Clean Code Other fixes I forgot to list! Java 14 Fixed issue where deleting a character would prevent it from leaving the screen or being removed, or even after a delete CD (it would only exit when re-logging in or creating a new character). Added Premium System from the other C2 project (Needs testing and improvement). Added the "Improved" Community Board (incomplete).
  • 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