CCCPaste

f503e483e7a8a

diff --git a/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/SpoilSystemHandler/SpoilSystemHandler.java b/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/SpoilSystemHandler/SpoilSystemHandler.java
new file mode 100644
index 0000000..5893c2d
--- /dev/null
+++ b/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/SpoilSystemHandler/SpoilSystemHandler.java
@@ -0,0 +1,210 @@
+/*
+ * This file is part of the L2J Mobius project.
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package handlers.SpoilSystemHandler;
+
+import java.util.logging.Logger;
+
+import org.l2jmobius.commons.util.Rnd;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.actor.instance.Monster;
+import org.l2jmobius.gameserver.model.item.enums.ItemProcessType;
+import org.l2jmobius.gameserver.model.item.instance.Item;
+
+import custom.SpoilConfig.SpoilConfig;
+
+/**
+ * SpoilSystemHandler
+ * @author Stayway
+ */
+public class SpoilSystemHandler
+{
+	private static final Logger LOGGER = Logger.getLogger(SpoilSystemHandler.class.getName());
+	
+	private static final int SPOIL_SKILL_ID = 254;
+	
+	private static class SingletonHolder
+	{
+		protected static final SpoilSystemHandler INSTANCE = new SpoilSystemHandler();
+	}
+	
+	public static SpoilSystemHandler getInstance()
+	{
+		return SingletonHolder.INSTANCE;
+	}
+	
+	/**
+	 * @param player the player attempting to spoil
+	 * @param target the monster target
+	 * @return true if spoil was successful
+	 */
+	public boolean trySpoil(Player player, Monster target)
+	{
+		
+		if (!checkLevelDifference(player, target))
+		{
+			return false;
+		}
+		
+		// Calculate spoil chance
+		int spoilChance = calculateSpoilChance(player, target);
+		
+		// Roll for success
+		boolean success = Rnd.get(10000) < spoilChance;
+		
+		// Handle result
+		if (success)
+		{
+			handleSpoilSuccess(player, target, spoilChance);
+		}
+		else
+		{
+			handleSpoilFailure(player, target, spoilChance);
+		}
+		
+		return success;
+	}
+	
+	private boolean checkLevelDifference(Player player, Monster target)
+	{
+		int levelDiff = Math.abs(player.getLevel() - target.getLevel());
+		
+		if (levelDiff > SpoilConfig.SPOIL_MAX_LEVEL_DIFF)
+		{
+			if (SpoilConfig.SPOIL_FAIL_MESSAGE)
+			{
+				player.sendMessage("The level difference is too high to spoil this target.");
+			}
+			return false;
+		}
+		
+		return true;
+	}
+	
+	/**
+	 * @param player
+	 * @param target
+	 * @return
+	 */
+	private int calculateSpoilChance(Player player, Monster target)
+	{
+		int spoilChance = SpoilConfig.SPOIL_BASE_CHANCE;
+		
+		// Level difference penalty
+		int levelDiff = player.getLevel() - target.getLevel();
+		if (levelDiff < -SpoilConfig.SPOIL_LEVEL_DIFF_PENALTY)
+		{
+			int penalty = Math.abs(levelDiff + SpoilConfig.SPOIL_LEVEL_DIFF_PENALTY);
+			spoilChance -= penalty * SpoilConfig.SPOIL_LEVEL_DIFF_REDUCTION;
+		}
+		
+		// WIT bonus
+		spoilChance += player.getWIT() * 2;
+		
+		// Ensure within bounds (1% to 99%)
+		return Math.max(100, Math.min(9900, spoilChance));
+	}
+	
+	/**
+	 * Handle successful spoil
+	 * @param player
+	 * @param target
+	 * @param spoilChance
+	 */
+	private void handleSpoilSuccess(Player player, Monster target, int spoilChance)
+	{
+		// Give rewards
+		giveSpoilRewards(player, target);
+		
+		// Send success message
+		if (SpoilConfig.SPOIL_SUCCESS_MESSAGE)
+		{
+			player.sendMessage("Spoil successful! You obtained items from the target.");
+		}
+	}
+	
+	/**
+	 * Handle failed spoil
+	 * @param player
+	 * @param target
+	 * @param spoilChance
+	 */
+	private void handleSpoilFailure(Player player, Monster target, int spoilChance)
+	{
+		// Send fail message
+		if (SpoilConfig.SPOIL_FAIL_MESSAGE)
+		{
+			player.sendMessage("Spoil failed.");
+		}
+	}
+	
+	/**
+	 * Give spoil rewards to player
+	 * @param player
+	 * @param target
+	 */
+	
+	private void giveSpoilRewards(Player player, Monster target)
+	{
+		
+		// Give random materials (example items)
+		giveRandomMaterials(player, target);
+		
+	}
+	
+	/**
+	 * Give random materials based on target level
+	 * @param player
+	 * @param target
+	 */
+	@SuppressWarnings("unused")
+	private void giveRandomMaterials(Player player, Monster target)
+	{
+		// Example material items - adjust IDs as needed
+		int[] materialItems =
+		{
+			1865,
+			1866,
+			1867,
+			1868,
+			1869,
+			1870
+		}; // Animal bones, etc.
+		
+		int materialsToGive = Rnd.get(1, 3);
+		
+		for (int i = 0; i < materialsToGive; i++)
+		{
+			int itemId = materialItems[Rnd.get(materialItems.length)];
+			int itemCount = Rnd.get(1, (int) (target.getLevel() * SpoilConfig.SPOIL_MATERIAL_MULTIPLIER));
+			
+			// Usando teus imports exatos: ItemProcessType e Item
+			Item item = player.getInventory().addItem(ItemProcessType.SWEEP, itemId, itemCount, player, target);
+			
+		}
+	}
+	
+	/**
+	 * Check if a skill ID is the spoil skill
+	 * @param skillId
+	 * @return
+	 */
+	public boolean isSpoilSkill(int skillId)
+	{
+		return skillId == SPOIL_SKILL_ID;
+	}
+}
\ No newline at end of file