Noticias:

No tienes permiso para ver los enlaces. Para poder verlos Registrate o Conectate.

Menú Principal

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();
	}
}