Autor Tema: Extractable Items  (Leído 967 veces)

pachuli

  • Newbie
  • *
  • Mensajes: 6
  • Karma: +0/-0
    • Ver Perfil
Extractable Items
« en: Junio 03, 2020, 02:09:38 pm »
Hola que tal?
Les comento que habia encontrado un error con los extractable_items.csv. El tema es que al momento de fallar la extraccion, es decir cuando debido al % de exito no debia darte nada, el item extraible no desaparecia, de manera que uno podia seguir haciendo doble click hasta que obtuviera un % de exito y entonces te daba el producto y ahi si desaparecia el extraible.
Bueno, ahora yendo al punto les quiero compartir el arreglo que hice en el scrypt. /L2jAdmins_Core/src/l2j/gameserver/handler/item/ItemExtractableItems.java

con la modificacion lo que hace es mostrar un error en la consola, en caso de que el id del item que se este intentando crear sea un valor de numero negativo o nulo, es decir que el item no se encuentra en la base de datos. En el primer caso al ser un id negativo, se interpretara que la extraccion no fue exitosa por lo tanto, se le informa al usuario que fallo la extraccion pero nos dara un mensaje de consola para revisar el caso indicando items y el char que intento hacer la extraccion para asi revisar el caso. en el caso de que el id del item a crear no se encuentre en la base de datos dara un mensaje al jugador "Nothing happened". el item extraible permanecera y nos dara un mensaje de consola para checkear el caso.

La forma correcta para indicar que hay probabilidades de no obtener nada en la extraccion es usando un id de creacion "0" con la probabilidad restante para completar el 100% (esto nos serviria mas a modo de interpretacion) o bien, simplemente no ponemos nada, solamente los items con sus % de exito. La diferencia entre la suma del total de los items y el 100% sera el % de no obtener nada.

Quiero aclarar que no se de programacion e hice los cambios leyendo e interpretando los codigos ya existentes, por lo tanto creo que el codigo puede estar sujeto a errores. Por mi parte yo lo checkee y funciona perfecto. Si alguno de los programadores quiere acotar algo, bienvenido sea!
Una segunda aclaracion, en un principio pense en publicar el error como un reporte pero como agradecimiento a todos los que comparten su conocimiento y para evitar molestar pidiendo soluciones, pense que podia colaborar yo haciendolo por mi mismo y aca el resultado. Espero que les sirva :)


Código: [Seleccionar]
package l2j.gameserver.handler.item;

import java.util.logging.Logger;

import l2j.gameserver.data.ExtractableItemsData;
import l2j.gameserver.data.ItemData;
import l2j.gameserver.handler.ItemHandler.IItemHandler;
import l2j.gameserver.model.actor.L2Playable;
import l2j.gameserver.model.actor.instance.L2PcInstance;
import l2j.gameserver.model.holder.ExtractableItemHolder;
import l2j.gameserver.model.holder.ExtractableProductItemHolder;
import l2j.gameserver.model.items.instance.ItemInstance;
import l2j.gameserver.network.external.server.SystemMessage;
import l2j.util.Rnd;

/**
 * @author FBIagent 11/12/2006
 */
public class ItemExtractableItems implements IItemHandler
{
   private static final Logger LOG = Logger.getLogger(ItemData.class.getName());
   
   @Override
   public int[] getItemIds()
   {
      return ExtractableItemsData.getInstance().itemIDs();
   }
   
   @Override
   public void useItem(L2Playable playable, ItemInstance item)
   {
      if (!(playable instanceof L2PcInstance))
      {
         return;
      }
      
      final L2PcInstance activeChar = (L2PcInstance) playable;
      
      final int itemID = item.getId();
      final ExtractableItemHolder exitem = ExtractableItemsData.getInstance().getExtractableItem(itemID);
      
      if (exitem == null)
      {
         return;
      }
      
      int createItemID = 0;
      int createAmount = 0;
      final int rndNum = Rnd.get(100);
      int chanceFrom = 0;
      
      // calculate extraction
      for (final ExtractableProductItemHolder expi : exitem.getProductItems())
      {
         final int chance = expi.getChance();
         
         if ((rndNum >= chanceFrom) && (rndNum <= (chance + chanceFrom)))
         {
            createItemID = expi.getId();
            createAmount = expi.getAmmount();
            break;
         }
         
         chanceFrom += chance;
      }
      
      if (createItemID < 0)
      {
         LOG.warning("Extractable item: " + itemID + " has been destroy in char: " + activeChar.getName() + ". Try to create: " + createItemID + ". Error: it's not an item template!");
         activeChar.getInventory().destroyItemByItemId("Extract", itemID, 1, activeChar, true);
         activeChar.sendMessage("Extraction failed.");
         return;
      }
      
      if (createItemID == 0)
      {
         activeChar.getInventory().destroyItemByItemId("Extract", itemID, 1, activeChar, true);
         activeChar.sendMessage("Extraction failed.");
         return;
      }
      
      if (ItemData.getInstance().createDummyItem(createItemID) == null)
      {
         LOG.warning("Could not extract the item: " + itemID + " Error: " + createItemID + ". item not found, reapir or change your item!");
         activeChar.sendMessage("Nothing happened.");
         return;
      }
      
      if (!activeChar.getInventory().destroyItemByItemId("Extract", itemID, 1, activeChar.getTarget(), true))
      {
         return;
      }
      
      if (ItemData.getInstance().createDummyItem(createItemID).isStackable())
      {
         activeChar.getInventory().addItem("Extract", createItemID, createAmount, item, false);
      }
      else
      {
         for (int i = 0; i < createAmount; i++)
         {
            activeChar.getInventory().addItem("Extract", createItemID, createAmount, item, false);
         }
      }
      
      SystemMessage sm;
      
      if (createAmount > 1)
      {
         sm = new SystemMessage(SystemMessage.EARNED_S2_S1_S).addItemName(createItemID).addNumber(createAmount);
      }
      else
      {
         sm = new SystemMessage(SystemMessage.EARNED_ITEM_S1).addItemName(createItemID);
      }
      activeChar.sendPacket(sm);
   }
}

fissban

  • Desarrollador
  • Full Member
  • *
  • Mensajes: 155
  • Karma: +0/-0
    • Ver Perfil
Re:Extractable Items
« Respuesta #1 en: Noviembre 24, 2020, 11:50:37 am »
<script src="//db-ip.com/tools/showipcountry.js" async="async"></script>