package net.sf.l2j.gameserver.handler.itemhandlers;
import net.sf.l2j.gameserver.handler.IItemHandler;
import net.sf.l2j.gameserver.model.actor.Playable;
import net.sf.l2j.gameserver.model.actor.Player;
import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
import net.sf.l2j.gameserver.model.item.kind.Item;
import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* EnchantBoost by Atrein
*/
public class EnchantBoost implements IItemHandler
{
private static final long COOLDOWN_MILLIS = 2000; // 2 sec
private static final Map<Integer, Long> useTimestamps = new ConcurrentHashMap<>();
@Override
public void useItem(Playable playable, ItemInstance item, boolean forceUse)
{
if (!(playable instanceof Player player) || item == null)
return;
final int playerId = player.getObjectId();
final long now = System.currentTimeMillis();
final long lastUse = useTimestamps.getOrDefault(playerId, 0L);
if (now - lastUse < COOLDOWN_MILLIS)
{
player.sendMessage("You're using this item too quickly. Please wait a moment.");
return;
}
useTimestamps.put(playerId, now);
if (player.getBonusEnchantRate() > 0)
{
player.sendMessage("An enchant boost is already active.");
return;
}
final Item template = item.getItem();
final int bonus = template.getStatSet().getInteger("enchantBonus", 0);
if (bonus <= 0)
{
player.sendMessage("Invalid enchant bonus parameter.");
return;
}
player.setBonusEnchantRate(bonus);
player.destroyItem(item, 1, true);
player.sendMessage("Enchant bonus of +" + bonus + "% has been activated. It will apply to the next enchant.");
player.broadcastPacket(new MagicSkillUse(player, player, 2024, 1, 1000, 0)); //Firecracker
}
}
####################################################################################################
RequestEnchantItem.java
public final class RequestEnchantItem extends L2GameClientPacket
{
+private static final Logger LOG = Logger.getLogger(RequestEnchantItem.class.getName());
private int _objectId;
final MissionList mission = player.getMissions();
synchronized (item)
{
+ double chance = enchant.getChance(item);
+
+ int bonus = player.getBonusEnchantRate();
+ if (bonus > 0)
+ {
+ chance += bonus;
+ LOG.info("[Enchant] Player: " + player.getName() + " | base=" + (chance - bonus) + " + bonus=" + bonus + " => total=" + chance);
+ player.setBonusEnchantRate(0);
+ player.sendMessage("Your enchant bonus has been consumed.");
+ }
+ else
+ {
+ LOG.info("[Enchant] Player: " + player.getName() + " | base=" + chance + " | no bonus.");
+ }
+
+ // apply bonus chance from item handler
+ if (player.getBonusEnchantRate() > 0)
+ {
+ player.sendMessage("Your enchant bonus of +" + player.getBonusEnchantRate() + "% has been applied.");
+ chance += player.getBonusEnchantRate();
+ player.setBonusEnchantRate(0);
+ }
// last validation check
##########################################################################################
Logout.java
AntiFeedManager.getInstance().onDisconnect(player.getClient());
+ if (player.getBonusEnchantRate() > 0)
+ {
+ player.setBonusEnchantRate(0);
+ player.sendMessage("Your enchant bonus has been cleared upon logout.");
+ }
player.logout(true);
#####################################################################################################
ItemHandler.java
+ import net.sf.l2j.gameserver.handler.itemhandlers.EnchantBoost;
+ registerHandler(new EnchantBoost());
#################################################
Player.java
_dress = dress;
}
+ // Enchant bonus system
+ private int _bonusEnchantRate = 0;
+
+ public int getBonusEnchantRate()
+ {
+ return _bonusEnchantRate;
+ }
+
+ public void setBonusEnchantRate(int bonus)
+ {
+ _bonusEnchantRate = bonus;
+ }
}
###########################################################################
.xml
<item id="****" type="EtcItem" name="Enchant Boost Scroll +25%">
<set name="icon" val="icon.etc_scroll_white_i00" />
<set name="etcitem_type" val="SCROLL" />
<set name="material" val="PAPER" />
<set name="weight" val="10" />
<set name="price" val="10000" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="true" />
<set name="is_dropable" val="true" />
<set name="is_destroyable" val="true" />
<set name="is_depositable" val="true" />
<set name="handler" val="EnchantBoost" />
<set name="enchantBonus" val="25" />
</item>
import net.sf.l2j.gameserver.handler.IItemHandler;
import net.sf.l2j.gameserver.model.actor.Playable;
import net.sf.l2j.gameserver.model.actor.Player;
import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
import net.sf.l2j.gameserver.model.item.kind.Item;
import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* EnchantBoost by Atrein
*/
public class EnchantBoost implements IItemHandler
{
private static final long COOLDOWN_MILLIS = 2000; // 2 sec
private static final Map<Integer, Long> useTimestamps = new ConcurrentHashMap<>();
@Override
public void useItem(Playable playable, ItemInstance item, boolean forceUse)
{
if (!(playable instanceof Player player) || item == null)
return;
final int playerId = player.getObjectId();
final long now = System.currentTimeMillis();
final long lastUse = useTimestamps.getOrDefault(playerId, 0L);
if (now - lastUse < COOLDOWN_MILLIS)
{
player.sendMessage("You're using this item too quickly. Please wait a moment.");
return;
}
useTimestamps.put(playerId, now);
if (player.getBonusEnchantRate() > 0)
{
player.sendMessage("An enchant boost is already active.");
return;
}
final Item template = item.getItem();
final int bonus = template.getStatSet().getInteger("enchantBonus", 0);
if (bonus <= 0)
{
player.sendMessage("Invalid enchant bonus parameter.");
return;
}
player.setBonusEnchantRate(bonus);
player.destroyItem(item, 1, true);
player.sendMessage("Enchant bonus of +" + bonus + "% has been activated. It will apply to the next enchant.");
player.broadcastPacket(new MagicSkillUse(player, player, 2024, 1, 1000, 0)); //Firecracker
}
}
####################################################################################################
RequestEnchantItem.java
public final class RequestEnchantItem extends L2GameClientPacket
{
+private static final Logger LOG = Logger.getLogger(RequestEnchantItem.class.getName());
private int _objectId;
final MissionList mission = player.getMissions();
synchronized (item)
{
+ double chance = enchant.getChance(item);
+
+ int bonus = player.getBonusEnchantRate();
+ if (bonus > 0)
+ {
+ chance += bonus;
+ LOG.info("[Enchant] Player: " + player.getName() + " | base=" + (chance - bonus) + " + bonus=" + bonus + " => total=" + chance);
+ player.setBonusEnchantRate(0);
+ player.sendMessage("Your enchant bonus has been consumed.");
+ }
+ else
+ {
+ LOG.info("[Enchant] Player: " + player.getName() + " | base=" + chance + " | no bonus.");
+ }
+
+ // apply bonus chance from item handler
+ if (player.getBonusEnchantRate() > 0)
+ {
+ player.sendMessage("Your enchant bonus of +" + player.getBonusEnchantRate() + "% has been applied.");
+ chance += player.getBonusEnchantRate();
+ player.setBonusEnchantRate(0);
+ }
// last validation check
##########################################################################################
Logout.java
AntiFeedManager.getInstance().onDisconnect(player.getClient());
+ if (player.getBonusEnchantRate() > 0)
+ {
+ player.setBonusEnchantRate(0);
+ player.sendMessage("Your enchant bonus has been cleared upon logout.");
+ }
player.logout(true);
#####################################################################################################
ItemHandler.java
+ import net.sf.l2j.gameserver.handler.itemhandlers.EnchantBoost;
+ registerHandler(new EnchantBoost());
#################################################
Player.java
_dress = dress;
}
+ // Enchant bonus system
+ private int _bonusEnchantRate = 0;
+
+ public int getBonusEnchantRate()
+ {
+ return _bonusEnchantRate;
+ }
+
+ public void setBonusEnchantRate(int bonus)
+ {
+ _bonusEnchantRate = bonus;
+ }
}
###########################################################################
.xml
<item id="****" type="EtcItem" name="Enchant Boost Scroll +25%">
<set name="icon" val="icon.etc_scroll_white_i00" />
<set name="etcitem_type" val="SCROLL" />
<set name="material" val="PAPER" />
<set name="weight" val="10" />
<set name="price" val="10000" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="true" />
<set name="is_dropable" val="true" />
<set name="is_destroyable" val="true" />
<set name="is_depositable" val="true" />
<set name="handler" val="EnchantBoost" />
<set name="enchantBonus" val="25" />
</item>
Последнее редактирование: