Package l2p.gameserver.model

Source Code of l2p.gameserver.model.L2DropData

package l2p.gameserver.model;

import l2p.Config;
import l2p.gameserver.model.base.ItemToDrop;
import l2p.gameserver.tables.ItemTable;
import l2p.gameserver.templates.L2Item;
import l2p.util.GArray;
import l2p.util.Rnd;

public class L2DropData implements Cloneable
{
  private L2Item _item;
  private long _mindrop;
  private long _maxdrop;
  private boolean _sweep;
  private double _chance;
  private double _chanceInGroup;
  private int _groupId;
  private int _minLevel;
  private int _maxLevel;

  public L2DropData()
  {
  }

  public L2DropData(int id, long min, long max, double chance)
  {
    this(id, min, max, chance, 0, 0);
  }

  public L2DropData(int id, long min, long max, double chance, int minLevel)
  {
    this(id, min, max, chance, minLevel, 0);
  }

  public L2DropData(int id, long min, long max, double chance, int minLevel, int maxLevel)
  {
    _item = ItemTable.getInstance().getTemplate(id);
    _mindrop = min;
    _maxdrop = max;
    _chance = chance;
    _minLevel = minLevel;
    _maxLevel = maxLevel;
  }

  @Override
  public L2DropData clone()
  {
    return new L2DropData(getItemId(), getMinDrop(), getMaxDrop(), getChance(), getMinLevel(), getMaxLevel());
  }

  public int getItemId()
  {
    return _item.getItemId();
  }

  public L2Item getItem()
  {
    return _item;
  }

  public String getName()
  {
    return getItem().getName();
  }

  public void setItemId(int itemId)
  {
    _item = ItemTable.getInstance().getTemplate(itemId);
  }

  public void setGroupId(int gId)
  {
    _groupId = gId;
  }

  public int getGroupId()
  {
    return _groupId;
  }

  public long getMinDrop()
  {
    return _mindrop;
  }

  public long getMaxDrop()
  {
    return _maxdrop;
  }

  public boolean isSweep()
  {
    return _sweep;
  }

  public double getChance()
  {
    return _chance;
  }

  public void setMinDrop(long mindrop)
  {
    _mindrop = mindrop;
  }

  public void setMaxDrop(long maxdrop)
  {
    _maxdrop = maxdrop;
  }

  public void setSweep(boolean sweep)
  {
    _sweep = sweep;
  }

  public void setChance(double chance)
  {
    _chance = chance;
  }

  public void setChanceInGroup(double chance)
  {
    _chanceInGroup = chance;
  }

  public double getChanceInGroup()
  {
    return _chanceInGroup;
  }

  public int getMinLevel()
  {
    return _minLevel;
  }

  public int getMaxLevel()
  {
    return _maxLevel;
  }

  @Override
  public String toString()
  {
    return "ItemID: " + getItem() + " Min: " + getMinDrop() + " Max: " + getMaxDrop() + " Chance: " + getChance() / 10000.0 + "%";
  }

  @Override
  public boolean equals(Object o)
  {
    if(o instanceof L2DropData)
    {
      L2DropData drop = (L2DropData) o;
      return drop.getItemId() == getItemId();
    }
    return false;
  }

  /**
   * Подсчет шанса выпадения этой конкретной вещи
   * Используется в эвентах и некоторых специальных механизмах
   *
   * @param player игрок (его бонус влияет на шанс)
   * @param mod    (просто множитель шанса)
   * @return информация о выпавшей вещи
   */
  public GArray<ItemToDrop> roll(L2Player player, double mod, boolean isRaid)
  {
    float rate = (isRaid ? Config.RATE_DROP_RAIDBOSS : Config.RATE_DROP_ITEMS) * (player != null ? player.getRateItems() : 1);
    float adenarate = isRaid ? Config.RATE_DROP_RAIDBOSS * (player != null ? player.getRateAdena() : 1) : Config.getRateAdena(player);
    // calc group chance
    double calcChance = mod * _chance * (_item.isAdena() ? 1f : rate);
    int dropmult = 1;
    // Если шанс оказался больше 100%
    if(calcChance > L2Drop.MAX_CHANCE)
    {
      if(calcChance % L2Drop.MAX_CHANCE == 0) // если кратен 100% то тупо умножаем количество
      {
        dropmult = (int) (calcChance / L2Drop.MAX_CHANCE);
      }
      else
      { // иначе балансируем
        dropmult = (int) Math.ceil(calcChance / L2Drop.MAX_CHANCE); // множитель равен шанс / 100% округление вверх
        calcChance = calcChance / dropmult; // шанс равен шанс / множитель
        // в результате получаем увеличение количества и уменьшение шанса, при этом шанс не падает ниже 50%
      }
    }
    GArray<ItemToDrop> ret = new GArray<ItemToDrop>();
    for(int i = 1; i <= dropmult; i++)
    {
      if(Rnd.get(L2Drop.MAX_CHANCE) > calcChance)
      {
        continue;
      }
      ItemToDrop t = new ItemToDrop(_item.getItemId());
      // если это адена то умножаем на рейт адены, иначе на множитель перебора шанса
      float mult = _item.isAdena() ? adenarate : 1;
      if(getMinDrop() >= getMaxDrop())
      {
        t.count = (int) (getMinDrop() * mult);
      }
      else
      {
        t.count = Rnd.get((int) (getMinDrop() * mult), (int) (getMaxDrop() * mult));
      }
      ret.add(t);
    }
    return ret;
  }

  @Override
  public int hashCode()
  {
    return _item.getItemId();
  }
}
TOP

Related Classes of l2p.gameserver.model.L2DropData

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.