掉率保真:模组严格遵循 RATE_DROP_ADENA的设置,以及怪物 XML 中定义的最小/最大掉落值范围。
自动拾取兼容:检测是否开启了自动拾取(AutoLoot),若开启则将金币直接发送到背包或地面。
安全防护:原生保护机制,确保攻城BOSS及其小弟不受此规则影响。
白名单机制:允许特定的怪物ID被排除在“仅金币掉落”规则之外。
1. 核心代码修改 (Java)
Config.java
java
public static boolean ONLY_ADENA_DROP;
public static Set<Integer> ADENA_EXCLUDED_SET = new HashSet<>();
// 在加载方法中 (No carregamento / load method):
ONLY_ADENA_DROP = l2jModSettings.getProperty("OnlyAdenaDrop", false);
String[] excludedIds = l2jModSettings.getProperty("AdenaDropExcludedIds", "").split(",");
for (String id : excludedIds) {
if (!id.trim().isEmpty())
ADENA_EXCLUDED_SET.add(Integer.parseInt(id.trim()));
}
L2MonsterInstance.java
跳转到代码末尾,在最后一个 }之前添加以下代码:
java
@Override
public void doItemDrop(NpcTemplate template, L2Character lastAttacker)
{
if (Config.ONLY_ADENA_DROP && !Config.ADENA_EXCLUDED_SET.contains(template.getNpcId()))
{
if (!isRaid() && !isRaidMinion())
{
final L2PcInstance player = lastAttacker.getActingPlayer();
if (player == null)
return;
for (DropCategory cat : template.getDropData())
{
for (DropData drop : cat.getAllDrops())
{
if (drop.getItemId() == 57) // 57 = Adena (金币)
{
if (Rnd.get(1000000) <= drop.getChance())
{
int count = (int) (Rnd.get(drop.getMinDrop(), drop.getMaxDrop()) * Config.RATE_DROP_ADENA);
if (count < 1) count = 1;