|
|
@ -9,17 +9,10 @@ |
|
|
|
|
|
|
|
|
|
|
|
package engine.objects; |
|
|
|
package engine.objects; |
|
|
|
|
|
|
|
|
|
|
|
import engine.Enum.ItemContainerType; |
|
|
|
|
|
|
|
import engine.Enum.ItemType; |
|
|
|
|
|
|
|
import engine.Enum.OwnerType; |
|
|
|
|
|
|
|
import engine.gameManager.DbManager; |
|
|
|
|
|
|
|
import engine.server.MBServerStatics; |
|
|
|
import engine.server.MBServerStatics; |
|
|
|
import org.pmw.tinylog.Logger; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.concurrent.ConcurrentHashMap; |
|
|
|
import java.util.concurrent.ConcurrentHashMap; |
|
|
|
import java.util.concurrent.ThreadLocalRandom; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class LootTable { |
|
|
|
public class LootTable { |
|
|
|
|
|
|
|
|
|
|
@ -124,377 +117,6 @@ public class LootTable { |
|
|
|
return modTypeTable; |
|
|
|
return modTypeTable; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static int gaussianLevel(int level) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int ret = -76; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (ret < -75 || ret > 75) { |
|
|
|
|
|
|
|
ret = (int) (ThreadLocalRandom.current().nextGaussian() * 75); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return (level * 5) + ret; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static Item CreateGamblerItem(Item item, PlayerCharacter gambler) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (item == null) |
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int groupID = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch (item.getItemBase().getUUID()) { |
|
|
|
|
|
|
|
case 971050: //Wrapped Axe
|
|
|
|
|
|
|
|
groupID = 3000; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971051://Wrapped Great Axe
|
|
|
|
|
|
|
|
groupID = 3005; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971052://Wrapped Throwing Axe
|
|
|
|
|
|
|
|
groupID = 3010; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971053:// Wrapped Bow
|
|
|
|
|
|
|
|
groupID = 3015; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971054://Wrapped Crossbow
|
|
|
|
|
|
|
|
groupID = 3020; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971055: //Wrapped Dagger
|
|
|
|
|
|
|
|
groupID = 3025; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971056: // Wrapped Throwing Dagger
|
|
|
|
|
|
|
|
groupID = 3030; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971057: // Wrapped Hammer
|
|
|
|
|
|
|
|
groupID = 3035; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971058:// Wrapped Great Hammer
|
|
|
|
|
|
|
|
groupID = 3040; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971059:// Wrapped Throwing Hammer
|
|
|
|
|
|
|
|
groupID = 3045; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971060:// Wrapped Polearm
|
|
|
|
|
|
|
|
groupID = 3050; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971061:// Wrapped Spear
|
|
|
|
|
|
|
|
groupID = 3055; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971062:// Wrapped Staff
|
|
|
|
|
|
|
|
groupID = 3060; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971063:// Wrapped Sword
|
|
|
|
|
|
|
|
groupID = 3065; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971064:// Wrapped Great Sword
|
|
|
|
|
|
|
|
groupID = 3070; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971065:// Wrapped Unarmed Weapon
|
|
|
|
|
|
|
|
groupID = 3075; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971066:// Wrapped Cloth Armor
|
|
|
|
|
|
|
|
groupID = 3100; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971067:// Wrapped Light Armor
|
|
|
|
|
|
|
|
groupID = 3105; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971068:// Wrapped Medium Armor
|
|
|
|
|
|
|
|
groupID = 3110; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971069:// Wrapped Heavy Armor
|
|
|
|
|
|
|
|
groupID = 3115; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971070:// Wrapped Rune
|
|
|
|
|
|
|
|
groupID = 3200; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 971071:// Wrapped City Improvement
|
|
|
|
|
|
|
|
groupID = 3210; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
//couldnt find group
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (groupID == 0) |
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LootTable lootGroup = LootTable.genTables.get(groupID); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (lootGroup == null) |
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float calculatedMobLevel; |
|
|
|
|
|
|
|
int minSpawn; |
|
|
|
|
|
|
|
int maxSpawn; |
|
|
|
|
|
|
|
int spawnQuanity = 0; |
|
|
|
|
|
|
|
int subTableID; |
|
|
|
|
|
|
|
String modifierPrefix = ""; |
|
|
|
|
|
|
|
String modifierSuffix = ""; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Lookup Table Variables
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LootTable lootTable; |
|
|
|
|
|
|
|
LootRow lootRow; |
|
|
|
|
|
|
|
LootRow groupRow = null; |
|
|
|
|
|
|
|
LootTable modTable; |
|
|
|
|
|
|
|
LootTable modGroup; |
|
|
|
|
|
|
|
LootRow modRow = null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Used for actual generation of items
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int itemBaseUUID; |
|
|
|
|
|
|
|
ItemBase itemBase = null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int roll = ThreadLocalRandom.current().nextInt(100) + 1; //Does not return Max, but does return min?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
groupRow = lootGroup.getLootRow(roll); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lootTable = LootTable.itemTables.get(groupRow.getValueOne()); |
|
|
|
|
|
|
|
roll = ThreadLocalRandom.current().nextInt(100) + 1; |
|
|
|
|
|
|
|
lootRow = lootTable.getLootRow(roll + 220); //get the item row from the bell's curve of level +-15
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (lootRow == null) |
|
|
|
|
|
|
|
return null; //no item found for roll
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
itemBaseUUID = lootRow.getValueOne(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (lootRow.getValueOne() == 0) |
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//handle quantities > 1 for resource drops
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
minSpawn = lootRow.getValueTwo(); |
|
|
|
|
|
|
|
maxSpawn = lootRow.getValueThree(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// spawnQuanity between minspawn (inclusive) and maxspawn (inclusive)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (maxSpawn > 1) |
|
|
|
|
|
|
|
spawnQuanity = ThreadLocalRandom.current().nextInt((maxSpawn + 1 - minSpawn)) + minSpawn; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//get modifierPrefix
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
calculatedMobLevel = 49; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int chanceMod = ThreadLocalRandom.current().nextInt(100) + 1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (chanceMod < 25) { |
|
|
|
|
|
|
|
modGroup = LootTable.modTypeTables.get(groupRow.getValueTwo()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (modGroup != null) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int a = 0; a < 10; a++) { |
|
|
|
|
|
|
|
roll = ThreadLocalRandom.current().nextInt(100) + 1; |
|
|
|
|
|
|
|
modRow = modGroup.getLootRow(roll); |
|
|
|
|
|
|
|
if (modRow != null) |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (modRow != null) { |
|
|
|
|
|
|
|
subTableID = modRow.getValueOne(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (LootTable.modTables.containsKey(subTableID)) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
modTable = LootTable.modTables.get(subTableID); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
roll = gaussianLevel((int) calculatedMobLevel); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (roll < modTable.minRoll) |
|
|
|
|
|
|
|
roll = (int) modTable.minRoll; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (roll > modTable.maxRoll) |
|
|
|
|
|
|
|
roll = (int) modTable.maxRoll; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
modRow = modTable.getLootRow(roll); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (modRow != null) |
|
|
|
|
|
|
|
modifierPrefix = modRow.getAction(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else if (chanceMod < 50) { |
|
|
|
|
|
|
|
modGroup = LootTable.modTypeTables.get(groupRow.getValueThree()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (modGroup != null) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int a = 0; a < 10; a++) { |
|
|
|
|
|
|
|
roll = ThreadLocalRandom.current().nextInt(100) + 1; |
|
|
|
|
|
|
|
modRow = modGroup.getLootRow(roll); |
|
|
|
|
|
|
|
if (modRow != null) |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (modRow != null) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subTableID = modRow.getValueOne(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (LootTable.modTables.containsKey(subTableID)) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
modTable = LootTable.modTables.get(subTableID); |
|
|
|
|
|
|
|
roll = gaussianLevel((int) calculatedMobLevel); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (roll < modTable.minRoll) |
|
|
|
|
|
|
|
roll = (int) modTable.minRoll; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (roll > modTable.maxRoll) |
|
|
|
|
|
|
|
roll = (int) modTable.maxRoll; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
modRow = modTable.getLootRow(roll); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (modRow == null) |
|
|
|
|
|
|
|
modRow = modTable.getLootRow((int) ((modTable.minRoll + modTable.maxRoll) * .05f)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (modRow != null) |
|
|
|
|
|
|
|
modifierSuffix = modRow.getAction(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
modGroup = LootTable.modTypeTables.get(groupRow.getValueTwo()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (modGroup != null) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int a = 0; a < 10; a++) { |
|
|
|
|
|
|
|
roll = ThreadLocalRandom.current().nextInt(100) + 1; |
|
|
|
|
|
|
|
modRow = modGroup.getLootRow(roll); |
|
|
|
|
|
|
|
if (modRow != null) |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (modRow != null) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subTableID = modRow.getValueOne(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (LootTable.modTables.containsKey(subTableID)) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
modTable = LootTable.modTables.get(subTableID); |
|
|
|
|
|
|
|
roll = gaussianLevel((int) calculatedMobLevel); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (roll < modTable.minRoll) |
|
|
|
|
|
|
|
roll = (int) modTable.minRoll; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (roll > modTable.maxRoll) |
|
|
|
|
|
|
|
roll = (int) modTable.maxRoll; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
modRow = modTable.getLootRow(roll); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (modRow == null) |
|
|
|
|
|
|
|
modRow = modTable.getLootRow((int) ((modTable.minRoll + modTable.maxRoll) * .05f)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (modRow != null) |
|
|
|
|
|
|
|
modifierPrefix = modRow.getAction(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//get modifierSuffix
|
|
|
|
|
|
|
|
modGroup = LootTable.modTypeTables.get(groupRow.getValueThree()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (modGroup != null) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int a = 0; a < 10; a++) { |
|
|
|
|
|
|
|
roll = ThreadLocalRandom.current().nextInt(100) + 1; |
|
|
|
|
|
|
|
modRow = modGroup.getLootRow(roll); |
|
|
|
|
|
|
|
if (modRow != null) |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (modRow != null) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subTableID = modRow.getValueOne(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (LootTable.modTables.containsKey(subTableID)) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
modTable = LootTable.modTables.get(subTableID); |
|
|
|
|
|
|
|
roll = gaussianLevel((int) calculatedMobLevel); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (roll < modTable.minRoll) |
|
|
|
|
|
|
|
roll = (int) modTable.minRoll; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (roll > modTable.maxRoll) |
|
|
|
|
|
|
|
roll = (int) modTable.maxRoll; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
modRow = modTable.getLootRow(roll); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (modRow == null) |
|
|
|
|
|
|
|
modRow = modTable.getLootRow((int) ((modTable.minRoll + modTable.maxRoll) * .05f)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (modRow != null) |
|
|
|
|
|
|
|
modifierSuffix = modRow.getAction(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
itemBase = ItemBase.getItemBase(itemBaseUUID); |
|
|
|
|
|
|
|
byte charges = (byte) itemBase.getNumCharges(); |
|
|
|
|
|
|
|
short dur = (short) itemBase.getDurability(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
short weight = itemBase.getWeight(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!gambler.getCharItemManager().hasRoomInventory(weight)) |
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Item gambledItem = new Item(itemBase, gambler.getObjectUUID(), |
|
|
|
|
|
|
|
OwnerType.PlayerCharacter, charges, charges, dur, dur, |
|
|
|
|
|
|
|
true, false, ItemContainerType.INVENTORY, (byte) 0, |
|
|
|
|
|
|
|
new ArrayList<>(), ""); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (spawnQuanity == 0 && itemBase.getType().equals(ItemType.RESOURCE)) |
|
|
|
|
|
|
|
spawnQuanity = 1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (spawnQuanity > 0) |
|
|
|
|
|
|
|
item.setNumOfItems(spawnQuanity); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
gambledItem = DbManager.ItemQueries.ADD_ITEM(gambledItem); |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
|
|
Logger.error(e); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (gambledItem == null) |
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!modifierPrefix.isEmpty()) |
|
|
|
|
|
|
|
gambledItem.addPermanentEnchantment(modifierPrefix, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!modifierSuffix.isEmpty()) |
|
|
|
|
|
|
|
gambledItem.addPermanentEnchantment(modifierSuffix, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//add item to inventory
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gambler.getCharItemManager().addItemToInventory(gambledItem); |
|
|
|
|
|
|
|
gambler.getCharItemManager().updateInventory(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return gambledItem; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void addRow(float min, float max, int valueOne, int valueTwo, int valueThree, String action) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//hackey way to set the minimum roll for SHIAT!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (min < this.minRoll) |
|
|
|
|
|
|
|
this.minRoll = min; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (max > this.maxRoll) |
|
|
|
|
|
|
|
this.maxRoll = max; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int minInt = (int) min; |
|
|
|
|
|
|
|
int maxInt = (int) max; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Round up min
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (minInt != min) |
|
|
|
|
|
|
|
min = minInt + 1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Round down max;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (maxInt != max) |
|
|
|
|
|
|
|
max = maxInt; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LootRow lootRow = new LootRow(valueOne, valueTwo, valueThree, action); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = (int) min; i <= max; i++) |
|
|
|
|
|
|
|
lootTable.put(i, lootRow); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public LootRow getLootRow(int probability) { |
|
|
|
public LootRow getLootRow(int probability) { |
|
|
|
|
|
|
|
|
|
|
|
if (lootTable.containsKey(probability)) |
|
|
|
if (lootTable.containsKey(probability)) |
|
|
|