Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Index: java/com/l2jserver/gameserver/instancemanager/AntiFeedManager.java
- ===================================================================
- --- java/com/l2jserver/gameserver/instancemanager/AntiFeedManager.java (revision 5453)
- +++ java/com/l2jserver/gameserver/instancemanager/AntiFeedManager.java (working copy)
- @@ -14,6 +14,9 @@
- */
- package com.l2jserver.gameserver.instancemanager;
- +import gnu.trove.TIntObjectHashMap;
- +import gnu.trove.TObjectProcedure;
- +
- import java.util.Map;
- import javolution.util.FastMap;
- @@ -26,7 +29,8 @@
- public class AntiFeedManager
- {
- private Map<Integer,Long> _lastDeathTimes;
- -
- + private TIntObjectHashMap<Map<Integer, Integer>> _eventIPs;
- +
- public static final AntiFeedManager getInstance()
- {
- return SingletonHolder._instance;
- @@ -35,6 +39,7 @@
- private AntiFeedManager()
- {
- _lastDeathTimes = new FastMap<Integer,Long>().shared();
- + _eventIPs = new TIntObjectHashMap<Map<Integer, Integer>>();
- }
- /**
- @@ -96,7 +101,153 @@
- {
- _lastDeathTimes.clear();
- }
- -
- +
- + /**
- + * Register new event for dualbox check.
- + * Should be called only once.
- + * @param eventId
- + */
- + public final void registerEvent(int eventId)
- + {
- + if (!_eventIPs.containsKey(eventId))
- + _eventIPs.put(eventId, new FastMap<Integer, Integer>());
- + }
- +
- + /**
- + * If number of all simultaneous connections from player's IP address lower than max
- + * then increment connection count and return true.
- + * Returns false if number of all simultaneous connections from player's IP address
- + * higher than max.
- + * @param eventId
- + * @param player
- + * @param max
- + * @return
- + */
- + public final boolean tryAddPlayer(int eventId, L2PcInstance player, int max)
- + {
- + if (_eventIPs.isEmpty())
- + return false;
- +
- + final Map<Integer, Integer> event = _eventIPs.get(eventId);
- + if (event == null)
- + return false; // no such event registered
- +
- + final L2GameClient client = player.getClient();
- + if (client == null || client.isDetached())
- + return false; // unable to determine IP address
- +
- + final Integer addrHash = Integer.valueOf(client.getConnection().getInetAddress().hashCode());
- + Integer number;
- + synchronized (event)
- + {
- + number = event.get(addrHash);
- + if (number == null)
- + {
- + number = new Integer(0);
- + event.put(addrHash, number);
- + }
- + }
- +
- + synchronized (number)
- + {
- + if (number < max)
- + {
- + number++;
- + return true;
- + }
- + }
- + return false;
- + }
- +
- + /**
- + * Decreasing number of active connection from player's IP address
- + * Returns true if success and false if any problem detected.
- + * @param eventId
- + * @param player
- + * @return
- + */
- + public final boolean removePlayer(int eventId, L2PcInstance player)
- + {
- + if (_eventIPs.isEmpty())
- + return false;
- +
- + final Map<Integer, Integer> event = _eventIPs.get(eventId);
- + if (event == null)
- + return false; // no such event registered
- +
- + final L2GameClient client = player.getClient();
- + if (client == null || client.isDetached())
- + return false; // unable to determine IP address
- +
- + final Integer addrHash = Integer.valueOf(client.getConnection().getInetAddress().hashCode());
- + Integer number = event.get(addrHash);
- + if (number == null)
- + return false; // address not registered
- +
- + synchronized (number)
- + {
- + if (number > 0)
- + {
- + number--;
- + return true;
- + }
- + return false; // all boxes connected from this IP already removed
- + }
- + }
- +
- + /**
- + * Remove player connection IP address from all registered events lists.
- + * @param player
- + */
- + public final void disconnectPlayer(L2PcInstance player)
- + {
- + if (_eventIPs.isEmpty())
- + return;
- +
- + final L2GameClient client = player.getClient();
- + if (client == null || client.isDetached())
- + return;
- +
- + final Integer addrHash = Integer.valueOf(client.getConnection().getInetAddress().hashCode());
- + _eventIPs.forEachValue(new DisconnectProcedure(addrHash));
- + }
- +
- + /**
- + * Clear all entries for this eventId.
- + * @param eventId
- + */
- + public final void clear(int eventId)
- + {
- + final Map<Integer, Integer> event = _eventIPs.get(eventId);
- + if (event != null)
- + event.clear();
- + }
- +
- + private final class DisconnectProcedure implements TObjectProcedure<Map<Integer, Integer>>
- + {
- + private final Integer _addrHash;
- +
- + public DisconnectProcedure(Integer hash)
- + {
- + _addrHash = hash;
- + }
- +
- + @Override
- + public final boolean execute(Map<Integer, Integer> event)
- + {
- + Integer number = event.get(_addrHash);
- + if (number != null)
- + {
- + synchronized (number)
- + {
- + if (number > 0)
- + number--;
- + }
- + }
- + return true;
- + }
- + }
- +
- @SuppressWarnings("synthetic-access")
- private static class SingletonHolder
- {
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement