Dupe protection

Iniciado por Swarlog, Jun 25, 2025, 09:09 PM

Tema anterior - Siguiente tema

Swarlog

/**
    * Get back items in inventory from database
    */
   @Override
   public void restore()
   {
      Connection con = null;
      int BanStatus = 0;
      int char_id;
     
      try
      {
         con = L2DatabaseFactory.getInstance().getConnection();
         PreparedStatement statement = con.prepareStatement("SELECT object_id, item_id, count, enchant_level, loc, loc_data, custom_type1, custom_type2, mana_left, time FROM items WHERE owner_id=? AND (loc=? OR loc=?) ORDER BY loc_data");
         statement.setInt(1, getOwnerId());
         statement.setString(2, getBaseLocation().name());
         statement.setString(3, getEquipLocation().name());
         ResultSet inv = statement.executeQuery();
         
         L2ItemInstance item;
         while (inv.next())
         {
            item = L2ItemInstance.restoreFromDb(getOwnerId(), inv);
           
            if (item == null)
            {
               continue;
            }
            // Bug get empty items when double session is created
            if (L2World.getInstance().findObject(inv.getInt("object_id")) != null)
            {
               _log.log(Level.WARNING, "Item: " + item.getObjectId() + " Has Duplied on World And Cannot be Load");
               L2World.getInstance().removeObject(item);
               BanStatus = 1;
               continue;
               
            }
           
            if (getOwner() instanceof L2PcInstance)
            {
               L2PcInstance player = (L2PcInstance) getOwner();
               
               if (!player.isGM() && !player.isHero() && item.isHeroItem())
               {
                  item.setLocation(ItemLocation.INVENTORY);
               }
            }
           
            L2World.getInstance().storeObject(item);
           
            // If stackable item is found in inventory just add to current quantity
            if (item.isStackable() && (getItemByItemId(item.getItemId()) != null))
            {
               addItem("Restore", item, getOwner().getActingPlayer(), null);
            }
            else
            {
               addItem(item);
            }
         }
         inv.close();
         statement.close();
         refreshWeight();
         
         /* ---------------------- Ban account --------------------------- */
         
         if (BanStatus == 1)
         {
            Connection BanCon = null;
           
            try
            {
               BanCon = L2DatabaseFactory.getInstance().getConnection();
               // PreparedStatement statement2 = BanCon.prepareStatement("update accounts set accesslevel =-100 where login in (select account_name from characters where charid = ? )");
               PreparedStatement statement2 = BanCon.prepareStatement("update accounts  acc , characters ch, accounts ac2   set ac2.accesslevel = -100  where acc.login = ch.account_name  and ch.charid = ?  and acc.lastIP = ac2.lastIP ");
               statement2.setInt(1, getOwnerId());
               int BanSQL = statement2.executeUpdate();
               
               char_id = getOwnerId();
               
               _log.log(Level.WARNING, "BANIDO POR SESSAO DUPLA A CONTA PRINCIPAL DO CHAR_ID : " + char_id);
               
            }
            catch (Exception e)
            {
               _log.log(Level.WARNING, "Falha ao banir usuario: " + e.getMessage(), e);
            }
            finally
            {
               L2DatabaseFactory.close(BanCon);
            }
         }
         /* ---------------------- end Ban account --------------------------- */
      }
      catch (Exception e)
      {
         _log.log(Level.WARNING, "Could not restore inventory: " + e.getMessage(), e);
      }
      finally
      {
         L2DatabaseFactory.close(con);
      }
   }

Se trata de un code suelto/complementario, por ello tiene el (@Override). Lo que hace es llamar a la función restore de L2PcInstance y hace además ese chequeo que indica para evitar el dupe.

Par poder utilizarlo podrias ponerlo en una nueva clase, por ejemplo:

public class DupProtection extends AbstractNpcAI
{
private DupProtection()
{
super(DupProtection.class.getSimpleName(), "xxxxx/custom");
}

/**
* Get back items in inventory from database
*/
@Override
public void restore()
{
Connection con = null;
int BanStatus = 0;
int char_id;

try
{
con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement("SELECT object_id, item_id, count, enchant_level, loc, loc_data, custom_type1, custom_type2, mana_left, time FROM items WHERE owner_id=? AND (loc=? OR loc=?) ORDER BY loc_data");
statement.setInt(1, getOwnerId());
statement.setString(2, getBaseLocation().name());
statement.setString(3, getEquipLocation().name());
ResultSet inv = statement.executeQuery();

L2ItemInstance item;
while (inv.next())
{
item = L2ItemInstance.restoreFromDb(getOwnerId(), inv);

if (item == null)
{
continue;
}
// Bug get empty items when double session is created
if (L2World.getInstance().findObject(inv.getInt("object_id")) != null)
{
_log.log(Level.WARNING, "Item: " + item.getObjectId() + " Has Duplied on World And Cannot be Load");
L2World.getInstance().removeObject(item);
BanStatus = 1;
continue;

}

if (getOwner() instanceof L2PcInstance)
{
L2PcInstance player = (L2PcInstance) getOwner();

if (!player.isGM() && !player.isHero() && item.isHeroItem())
{
item.setLocation(ItemLocation.INVENTORY);
}
}

L2World.getInstance().storeObject(item);

// If stackable item is found in inventory just add to current quantity
if (item.isStackable() && (getItemByItemId(item.getItemId()) != null))
{
addItem("Restore", item, getOwner().getActingPlayer(), null);
}
else
{
addItem(item);
}
}
inv.close();
statement.close();
refreshWeight();

/* ---------------------- Ban account --------------------------- */

if (BanStatus == 1)
{
Connection BanCon = null;

try
{
BanCon = L2DatabaseFactory.getInstance().getConnection();
// PreparedStatement statement2 = BanCon.prepareStatement("update accounts set accesslevel =-100 where login in (select account_name from characters where charid = ? )");
PreparedStatement statement2 = BanCon.prepareStatement("update accounts  acc , characters ch, accounts ac2 set ac2.accesslevel = -100  where acc.login = ch.account_name  and ch.charid = ?  and acc.lastIP = ac2.lastIP ");
statement2.setInt(1, getOwnerId());
int BanSQL = statement2.executeUpdate();

char_id = getOwnerId();

_log.log(Level.WARNING, "BANIDO POR SESSAO DUPLA A CONTA PRINCIPAL DO CHAR_ID : " + char_id);

}
catch (Exception e)
{
_log.log(Level.WARNING, "Falha ao banir usuario: " + e.getMessage(), e);
}
finally
{
L2DatabaseFactory.close(BanCon);
}
}
/* ---------------------- end Ban account --------------------------- */
}
catch (Exception e)
{
_log.log(Level.WARNING, "Could not restore inventory: " + e.getMessage(), e);
}
finally
{
L2DatabaseFactory.close(con);
}
}

public static void main(String[] args)
{
new DupProtection();
}
}