From 26eda324dc8098c63951f15516ee645eb3e85b66 Mon Sep 17 00:00:00 2001
From: FatBoy-DOTC <justin.chucksinsulating@gmail.com>
Date: Sun, 29 Dec 2024 15:38:59 -0600
Subject: [PATCH] adjusted global drop rates

---
 src/engine/gameManager/LootManager.java | 80 ++++++++++++++-----------
 1 file changed, 46 insertions(+), 34 deletions(-)

diff --git a/src/engine/gameManager/LootManager.java b/src/engine/gameManager/LootManager.java
index 55d6c154..93cabacf 100644
--- a/src/engine/gameManager/LootManager.java
+++ b/src/engine/gameManager/LootManager.java
@@ -127,46 +127,58 @@ public enum LootManager {
         float dropRate;
 
         if (!mob.getSafeZone()) {
-            boolean allow = false;
-            if(mob.level >= 50){
-                allow = true;
-            }else{
-                if((50 - mob.level) > ThreadLocalRandom.current().nextInt(0,101)){
-                    allow = true;
-                }
+            int contractLow = 1, contractHigh = 400;
+            int runeLow = 401, runeHigh = 800;
+            int resourceLow = 801, resourceHigh = 900;
+            int glassLow = 901, glassHigh = 910;
+            int guardLow = 911, guardHigh = 920;
+
+            // Pre-compute adjusted high values
+            int contractAdjust = 0, runeAdjust = 0, resourceAdjust = 0, glassAdjust = 0, guardAdjust = 0;
+            if (mob.level < 50) {
+                int dif = 50 - mob.level;
+                contractAdjust = (int)(400 * (dif * 0.02f));
+                runeAdjust = (int)(400 * (dif * 0.02f));
+                resourceAdjust = (int)(100 * (dif * 0.02f));
+                glassAdjust = (int)(10 * (dif * 0.02f));
+                guardAdjust = (int)(10 * (dif * 0.02f));
             }
 
-            if(allow) {
-                // Roll within the adjusted range
-                int specialCaseRoll = ThreadLocalRandom.current().nextInt(1, 100000 + 1);
-
-                // Special Case Contract Drop
-                if (specialCaseRoll <= 400) { // 0.4% of the range
-                    SpecialCaseResourceDrop(mob, entries);
-                } else if (specialCaseRoll <= 800) { // Next 0.4% of the range
-                    SpecialCaseContractDrop(mob, entries);
-                } else if (specialCaseRoll <= 1200) { // Next 0.4% of the range
-                    SpecialCaseRuneDrop(mob, entries);
-                } else if (specialCaseRoll <= 1210) { // Next 0.01% of the range
-                    int glassID = rollRandomItem(126);
-                    ItemBase glassItem = ItemBase.getItemBase(glassID);
-                    if (glassItem != null) {
-                        MobLoot toAddGlass = new MobLoot(mob, glassItem, false);
-                        if (toAddGlass != null)
-                            mob.getCharItemManager().addItemToInventory(toAddGlass);
-                    }
-                } else if (specialCaseRoll <= 1220) { // Next 0.01% of the range
-                    int guardContractID = racial_guard_uuids.get(new java.util.Random().nextInt(racial_guard_uuids.size()));
-                    ItemBase guardContract = ItemBase.getItemBase(guardContractID);
-                    if (guardContract != null) {
-                        MobLoot toAddContract = new MobLoot(mob, guardContract, false);
-                        if (toAddContract != null)
-                            mob.getCharItemManager().addItemToInventory(toAddContract);
-                    }
+            // Generate a single random roll
+            int specialCaseRoll = ThreadLocalRandom.current().nextInt(1, 100001);
+
+            // Calculate adjusted high values once
+            int contractHighAdjusted = contractHigh - contractAdjust;
+            int runeHighAdjusted = runeHigh - runeAdjust;
+            int resourceHighAdjusted = resourceHigh - resourceAdjust;
+            int glassHighAdjusted = glassHigh - glassAdjust;
+            int guardHighAdjusted = guardHigh - guardAdjust;
+
+            // Check the roll range and handle accordingly
+            if (specialCaseRoll >= contractLow && specialCaseRoll <= contractHighAdjusted) {
+                SpecialCaseContractDrop(mob, entries);
+            } else if (specialCaseRoll >= runeLow && specialCaseRoll <= runeHighAdjusted) {
+                SpecialCaseRuneDrop(mob, entries);
+            } else if (specialCaseRoll >= resourceLow && specialCaseRoll <= resourceHighAdjusted) {
+                SpecialCaseResourceDrop(mob, entries);
+            } else if (specialCaseRoll >= glassLow && specialCaseRoll <= glassHighAdjusted) {
+                int glassID = rollRandomItem(126);
+                ItemBase glassItem = ItemBase.getItemBase(glassID);
+                if (glassItem != null) {
+                    MobLoot toAddGlass = new MobLoot(mob, glassItem, false);
+                    mob.getCharItemManager().addItemToInventory(toAddGlass);
+                }
+            } else if (specialCaseRoll >= guardLow && specialCaseRoll <= guardHighAdjusted) {
+                int guardContractID = racial_guard_uuids.get(new java.util.Random().nextInt(racial_guard_uuids.size()));
+                ItemBase guardContract = ItemBase.getItemBase(guardContractID);
+                if (guardContract != null) {
+                    MobLoot toAddContract = new MobLoot(mob, guardContract, false);
+                    mob.getCharItemManager().addItemToInventory(toAddContract);
                 }
             }
         }
 
+
         // Iterate all entries in this bootySet and process accordingly
         for (BootySetEntry bse : entries) {
             switch (bse.bootyType) {