@ -9,17 +9,10 @@
@@ -9,17 +9,10 @@
package engine.objects ;
import engine.Enum.ItemContainerType ;
import engine.Enum.ItemType ;
import engine.Enum.OwnerType ;
import engine.gameManager.DbManager ;
import engine.server.MBServerStatics ;
import org.pmw.tinylog.Logger ;
import java.util.ArrayList ;
import java.util.HashMap ;
import java.util.concurrent.ConcurrentHashMap ;
import java.util.concurrent.ThreadLocalRandom ;
public class LootTable {
@ -124,377 +117,6 @@ public class LootTable {
@@ -124,377 +117,6 @@ public class LootTable {
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 ) {
if ( lootTable . containsKey ( probability ) )