Noticias:

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

Menú Principal

Anti-Dual Box PC

Iniciado por Swarlog, Ago 14, 2022, 01:25 AM

Tema anterior - Siguiente tema

Swarlog

Index: config/protected/other.properties
===================================================================
--- config/protected/other.properties (revision 991)
+++ config/protected/other.properties (working copy)
@@ -39,6 +39,9 @@
AllowDualBoxInOly = False
AllowDualBoxInEvent = False

+# Multbox protection based on client tracert comparison
+MultiBoxesPerPC = 2
+
#=================================#
# Bot Protection #
#=================================#
Index: head-src/com/l2jfrozen/Config.java
===================================================================
--- head-src/com/l2jfrozen/Config.java (revision 991)
+++ head-src/com/l2jfrozen/Config.java (working copy)
@@ -608,7 +608,8 @@
public static String CHAT_FILTER_CHARS;
public static String CHAT_FILTER_PUNISHMENT;
public static ArrayList<String> FILTER_LIST = new ArrayList<String>();
-
+ public static int MAX_PLAYERS_FROM_ONE_PC;
+
public static int FS_TIME_ATTACK;
public static int FS_TIME_COOLDOWN;
public static int FS_TIME_ENTRY;
@@ -3445,7 +3446,7 @@
ALLOW_DUALBOX_EVENT = Boolean.parseBoolean(POtherSetting.getProperty("AllowDualBoxInEvent", "True"));
ALLOWED_BOXES = Integer.parseInt(POtherSetting.getProperty("AllowedBoxes", "99"));
ALLOW_DUALBOX = Boolean.parseBoolean(POtherSetting.getProperty("AllowDualBox", "True"));
-
+ MAX_PLAYERS_FROM_ONE_PC = Integer.parseInt(POtherSetting.getProperty("MultiboxesPerPC", "2"));
BOT_PROTECTOR = Boolean.parseBoolean(POtherSetting.getProperty("BotProtect", "False"));
BOT_PROTECTOR_FIRST_CHECK = Integer.parseInt(POtherSetting.getProperty("BotProtectFirstCheck", "15"));
BOT_PROTECTOR_NEXT_CHECK = Integer.parseInt(POtherSetting.getProperty("BotProtectNextCheck", "60"));
@@ -5323,6 +5324,7 @@
{
TVT_REVIVE_DELAY = Long.parseLong(pValue);
}
+ else if (pName.equalsIgnoreCase("MultiBoxesPerPC")) MAX_PLAYERS_FROM_ONE_PC = Integer.parseInt(pValue);
else if(pName.equalsIgnoreCase("MinKarma"))
{
KARMA_MIN_KARMA = Integer.parseInt(pValue);
Index: java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java (revision 4348)
+++ java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java (working copy)
@@ -164,6 +164,7 @@
import com.l2jserver.gameserver.model.quest.State;
import com.l2jserver.gameserver.model.zone.type.L2BossZone;
import com.l2jserver.gameserver.network.L2GameClient;
+import com.l2jserver.gameserver.network.MultiBoxProtection;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.communityserver.CommunityServerThread;
import com.l2jserver.gameserver.network.communityserver.writepackets.WorldInfo;
@@ -11964,6 +11965,19 @@
_log.log(Level.SEVERE, "deleteMe()", e);
}

+ try
+ {
+ if (Config.MAX_PLAYERS_FROM_ONE_PC > 0 && getClient() != null
+ && getClient().getAdress() != null && getClient().getTrace() != null)
+ {
+ MultiBoxProtection.getInstance().removeConnection(getClient());
+ }
+ }
+ catch (Exception e)
+ {
+ _log.log(Level.SEVERE, "deleteMe()", e);
+ }
+
// Close the connection with the client
closeNetConnection(closeClient);
Index: head-src/com/l2jfrozen/gameserver/network/L2GameClient.java
===================================================================
--- head-src/com/l2jfrozen/gameserver/network/L2GameClient.java (revision 991)
+++ head-src/com/l2jfrozen/gameserver/network/L2GameClient.java (working copy)
@@ -93,6 +93,7 @@

// Info
public String accountName;
+ private String _adress;
public SessionKey sessionId;
public L2PcInstance activeChar;
private ReentrantLock _activeCharLock = new ReentrantLock();
@@ -110,7 +111,7 @@

// Crypt
public GameCrypt crypt;
-
+ private int[][] trace;
// Flood protection
public long packetsNextSendTick = 0;

@@ -130,6 +131,8 @@
public L2GameClient(MMOConnection<L2GameClient> con)
{
super(con);
+ if (con != null)
+ _adress = con.getInetAddress().getHostAddress();
state = GameClientState.CONNECTED;
_connectionstartTime = System.currentTimeMillis();
crypt = new GameCrypt();
@@ -233,6 +236,10 @@
return accountName;
}

+ public String getAdress()
+ {
+ return _adress;
+ }
public void setSessionId(SessionKey sk)
{
sessionId = sk;
@@ -973,8 +980,15 @@
//Decrease boxes number
if(player._active_boxes!=-1)
player.decreaseBoxes();
+ if (Config.MAX_PLAYERS_FROM_ONE_PC > 0)
+ {
+ MultiBoxProtection.getInstance().removeConnection(L2GameClient.this);
+ }
+ if (Config.MAX_PLAYERS_FROM_ONE_PC > 0 && !isDetached())
+ {
+ MultiBoxProtection.getInstance().removeConnection(L2GameClient.this);
+ }

-
if(!player.isKicked() && !Olympiad.getInstance().isRegistered(player)
&& !player.isInOlympiadMode()
&& !player.isInFunEvent()
@@ -1211,6 +1226,14 @@
_queueLock.unlock();
}
}
+ public void setClientTracert(int[][] tracert)
+ {
+ trace = tracert;
+ }
+ public int[][] getTrace()
+ {
+ return trace;
+ }

/**
* @return the _forcedToClose
Index: head-src/com/l2jfrozen/gameserver/network/MultiBoxProtection.java
===================================================================
--- head-src/com/l2jfrozen/gameserver/network/MultiBoxProtection.java (revision 0)
+++ head-src/com/l2jfrozen/gameserver/network/MultiBoxProtection.java (revision 0)
@@ -0,0 +1,155 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jfrozen.gameserver.network;
+
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.logging.Logger;
+import com.l2jfrozen.Config;
+
+import javolution.util.FastMap;
+
+
+/**
+ * @author LucasDesigner
+ *
+ */
+public class MultiBoxProtection
+{
+ protected static final Logger _log = Logger.getLogger(MultiBoxProtection.class.getName());
+ private Map<IpPack, Integer> map;
+
+ public static MultiBoxProtection getInstance()
+ {
+ return SingletonHolder._instance;
+ }
+
+ public MultiBoxProtection()
+ {
+ map = new FastMap<MultiBoxProtection.IpPack, Integer>();
+ }
+
+ public synchronized boolean registerNewConnection(L2GameClient client)
+ {
+ IpPack pack = new IpPack(client.getAdress(), client.getTrace());
+ Integer count = map.get(pack);
+ if (count == null)
+ {
+ count = 1;
+ map.put(pack, count);
+ if (Config.DEVELOPER)
+ _log.info("MultiBoxProtection.registerNewConnection(): Set Count for: "+ client.getActiveChar().getName() +" (" + client.getAdress() + ") to " + count);
+ return true;
+ }
+ else if (count < Config.MAX_PLAYERS_FROM_ONE_PC)
+ {
+ count++;
+ map.put(pack, count);
+ if (Config.DEVELOPER)
+ _log.info("MultiBoxProtection.registerNewConnection(): Increase Count for: "+ client.getActiveChar().getName() +" (" + client.getAdress() + ") to " + count);
+ return true;
+ }
+ else
+ {
+ count++;
+ map.put(pack, count);
+ if (Config.DEVELOPER)
+ _log.info("MultiBoxProtection.registerNewConnection(): Count for: "+ client.getActiveChar().getName() +" (" + client.getAdress() + ") is " + count);
+ return false;
+ }
+
+ }
+
+ public synchronized void removeConnection(L2GameClient client)
+ {
+ if (client == null)
+ return;
+
+ IpPack pack = new IpPack(client.getAdress(), client.getTrace());
+ Integer count = map.get(pack);
+ if (count != null && count > 1)
+ {
+ count--;
+ map.put(pack, count);
+ if (Config.DEVELOPER)
+ _log.info("MultiBoxProtection.removeConnection(): Decrease Count for: "+ client.getActiveChar().getName() +" (" + client.getAdress() + ") to " + count);
+
+ }
+ else
+ {
+ map.remove(pack);
+ if (Config.DEVELOPER)
+ _log.info("MultiBoxProtection.removeConnection(): Remove Count for: "+ client.getActiveChar().getName() +" (" + client.getAdress() + ")");
+ }
+ }
+
+ @SuppressWarnings("synthetic-access")
+ private static class SingletonHolder
+ {
+ protected static final MultiBoxProtection _instance = new MultiBoxProtection();
+ }
+
+ public final static class IpPack
+ {
+ String ip;
+ int[][] tracert;
+
+ public IpPack(String ip, int[][] tracert)
+ {
+ this.ip = ip;
+ this.tracert = tracert;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((ip == null) ? 0 : ip.hashCode());
+ if(tracert == null)
+ return result;
+ for (int[] array: tracert)
+ result = prime * result + Arrays.hashCode(array);
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ IpPack other = (IpPack) obj;
+ if (ip == null)
+ {
+ if (other.ip != null)
+ return false;
+ }
+ else if (!ip.equals(other.ip))
+ return false;
+ for (int i = 0 ; i < tracert.length; i++)
+ for (int o = 0; o < tracert[0].length; o++)
+ if (tracert[i][o] != other.tracert[i][o])
+ return false;
+ return true;
+ }
+
+ }
+}
+
Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/EnterWorld.java
===================================================================
--- head-src/com/l2jfrozen/gameserver/network/clientpackets/EnterWorld.java (revision 991)
+++ head-src/com/l2jfrozen/gameserver/network/clientpackets/EnterWorld.java (working copy)
@@ -68,6 +68,7 @@
import com.l2jfrozen.gameserver.model.entity.siege.Siege;
import com.l2jfrozen.gameserver.model.quest.Quest;
import com.l2jfrozen.gameserver.model.quest.QuestState;
+import com.l2jfrozen.gameserver.network.MultiBoxProtection;
import com.l2jfrozen.gameserver.network.Disconnection;
import com.l2jfrozen.gameserver.network.SystemMessageId;
import com.l2jfrozen.gameserver.network.serverpackets.ClientSetTime;
@@ -121,7 +122,7 @@
@Override
protected void runImpl()
{
- L2PcInstance activeChar = getClient().getActiveChar();
+ final L2PcInstance activeChar = getClient().getActiveChar();

if (activeChar == null)
{
@@ -422,6 +422,23 @@
activeChar.sendMessage("I'm sorry, but multibox is not allowed here.");
activeChar.logout();
}
+ if (Config.MAX_PLAYERS_FROM_ONE_PC > 0)
+ {
+ if (!MultiBoxProtection.getInstance().registerNewConnection(getClient()))
+ {
+ activeChar.sendMessage("Too many connections, please logout other characters first.");
+ if (Config.DEVELOPER)
+ _log.info("Too many conections, disconnecting " + activeChar.getName());
+ ThreadPoolManager.getInstance().scheduleGeneral(new Runnable()
+ {
+ public void run()
+ {
+ activeChar.logout(false);
+ }
+ }, 400);
+ return;
+ }
+ }

Hellows(activeChar);

Index: head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestRestart.java
===================================================================
--- head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestRestart.java (revision 991)
+++ head-src/com/l2jfrozen/gameserver/network/clientpackets/RequestRestart.java (working copy)
@@ -25,11 +25,14 @@
import com.l2jfrozen.gameserver.communitybbs.Manager.RegionBBSManager;
import com.l2jfrozen.gameserver.datatables.SkillTable;
import com.l2jfrozen.gameserver.model.Inventory;
import com.l2jfrozen.gameserver.model.L2Party;
import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
import com.l2jfrozen.gameserver.model.entity.olympiad.Olympiad;
import com.l2jfrozen.gameserver.model.entity.sevensigns.SevenSignsFestival;
import com.l2jfrozen.gameserver.network.L2GameClient;
+import com.l2jfrozen.gameserver.network.MultiBoxProtection;
import com.l2jfrozen.gameserver.network.L2GameClient.GameClientState;
import com.l2jfrozen.gameserver.network.SystemMessageId;
import com.l2jfrozen.gameserver.network.serverpackets.ActionFailed;
@@ -177,7 +187,11 @@
}

L2GameClient client = getClient();
-
+
+ if (Config.MAX_PLAYERS_FROM_ONE_PC > 0)
+ {
+ MultiBoxProtection.getInstance().removeConnection(client);
+ }
// detach the client from the char so that the connection isnt closed in the deleteMe
player.setClient(null);