@ -73,38 +73,38 @@ public enum LootManager {
}
}
public static void GenerateMobLoot ( Mob mob ) {
public static void GenerateMobLoot ( Mob mob ) {
int mobBootySet = mob . getMobBase ( ) . bootySet ;
if ( mobBootySet ! = 0 ) {
RunBootySetIfPresent ( mobBootySet , mob ) ;
}
mobBootySet = mob . bootySet ;
//iterate the booty sets
if ( mobBootySet ! = 0 ) {
RunBootySetIfPresent ( mobBootySet , mob ) ;
if ( mob . getMobBase ( ) . bootySet ! = 0 & & _bootySetMap . containsKey ( mob . getMobBase ( ) . bootySet ) = = true )
}
RunBootySet ( _bootySetMap . get ( mob . getMobBase ( ) . bootySet ) , mob ) ;
if ( mob . bootySet ! = 0 & & _bootySetMap . containsKey ( mob . bootySet ) = = true )
RunBootySet ( _bootySetMap . get ( mob . bootySet ) , mob ) ;
//lastly, check mobs inventory for godly or disc runes to send a server announcement
for ( Item it : mob . getInventory ( ) ) {
// Check mob's inventory for godly or disc runes to send a server announcement
ItemBase ib = it . getItemBase ( ) ;
for ( Item item : mob . getInventory ( ) ) {
if ( ib = = null )
ItemBase itemBase = item . getItemBase ( ) ;
break ;
if ( itemBase ! = null & & itemBase . getName ( ) . toLowerCase ( ) . contains ( "of the gods" ) ) {
if ( ib . getName ( ) . toLowerCase ( ) . contains ( "of the gods" ) ) {
ChatSystemMsg chatMsg = new ChatSystemMsg (
ChatSystemMsg chatMsg = new ChatSystemMsg ( null , mob . getName ( ) + " in " + mob . getParentZone ( ) . getName ( ) + " has found the " + ib . getName ( ) + ". Are you tough enough to take it?" ) ;
null ,
mob . getName ( ) + " in " + mob . getParentZone ( ) . getName ( ) + " has found the " + itemBase . getName ( ) + ". Are you tough enough to take it?"
) ;
chatMsg . setMessageType ( 10 ) ;
chatMsg . setMessageType ( 10 ) ;
chatMsg . setChannel ( Enum . ChatChannelType . SYSTEM . getChannelID ( ) ) ;
chatMsg . setChannel ( Enum . ChatChannelType . SYSTEM . getChannelID ( ) ) ;
DispatchMessage . dispatchMsgToAll ( chatMsg ) ;
DispatchMessage . dispatchMsgToAll ( chatMsg ) ;
}
}
}
}
}
}
private static void RunBootySet ( ArrayList < BootySetEntry > entries , Mob mob ) {
private static void RunBootySet ( ArrayList < BootySetEntry > entries , Mob mob ) {
float dropRate = NORMAL_DROP_RATE ;
boolean isSafeZone = mob . parentZone . getSafeZone ( ) = = 0 ;
if ( isSafeZone ) {
float dropRate = NORMAL_DROP_RATE ;
//roll the geenric world drop table
if ( mob . parentZone . getSafeZone ( ) = = 0 ) {
GenerateLootDrop ( mob , 1300 ) ;
GenerateLootDrop ( mob , 1300 ) ;
if ( ThreadLocalRandom . current ( ) . nextInt ( 1 , 10000 ) = = 5000 ) {
if ( ThreadLocalRandom . current ( ) . nextInt ( 1 , 10000 ) = = 5000 ) {
MobLoot extraLoot = rollForGlass ( mob ) ;
MobLoot extraLoot = rollForGlass ( mob ) ;
if ( extraLoot ! = null ) {
if ( extraLoot ! = null ) {
mob . getCharItemManager ( ) . addItemToInventory ( extraLoot ) ;
mob . getCharItemManager ( ) . addItemToInventory ( extraLoot ) ;
@ -112,6 +112,7 @@ public enum LootManager {
}
}
}
}
// Iterate all entries in this bootySet and process accordingly
boolean hasExtraRolled = false ;
boolean hasExtraRolled = false ;
for ( BootySetEntry bse : entries ) {
for ( BootySetEntry bse : entries ) {
switch ( bse . bootyType ) {
switch ( bse . bootyType ) {
@ -119,26 +120,17 @@ public enum LootManager {
GenerateGoldDrop ( mob , bse ) ;
GenerateGoldDrop ( mob , bse ) ;
break ;
break ;
case "LOOT" :
case "LOOT" :
if ( ThreadLocalRandom . current ( ) . nextInt ( 1 , 101 ) < ( bse . dropChance * dropRate ) ) {
if ( ThreadLocalRandom . current ( ) . nextInt ( 1 , 100 + 1 ) < ( bse . dropChance * dropRate ) )
GenerateLootDrop ( mob , bse . genTable ) ;
GenerateLootDrop ( mob , bse . genTable ) ; //generate normal loot drop
}
if ( mob . contractCounter > = 250 ) {
if ( isSafeZone & & ! hasExtraRolled & & ThreadLocalRandom . current ( ) . nextInt ( 1 , 5000 ) < 15 * dropRate ) {
MobLoot extraLoot = rollForContract ( bse . genTable , mob ) ;
MobLoot extraLoot = ( ThreadLocalRandom . current ( ) . nextInt ( 1 , 101 ) < = 50 )
if ( extraLoot ! = null )
? rollForContract ( bse . genTable , mob )
: rollForRune ( bse . genTable , mob ) ;
if ( extraLoot ! = null ) {
mob . getCharItemManager ( ) . addItemToInventory ( extraLoot ) ;
mob . getCharItemManager ( ) . addItemToInventory ( extraLoot ) ;
}
}
hasExtraRolled = true ;
if ( mob . runeCounter > = 250 ) {
MobLoot extraLoot = rollForRune ( bse . genTable , mob ) ;
if ( mob . parentZone . lastContractDrop + 3600000 > System . currentTimeMillis ( ) ) {
if ( extraLoot ! = null )
//no contract in last hour, force roll for one
mob . getCharItemManager ( ) . addItemToInventory ( extraLoot ) ;
rollForContract ( bse . genTable , mob ) ;
}
if ( mob . parentZone . lastRuneDrop + 3600000 > System . currentTimeMillis ( ) ) {
//no rune in last hour, force roll for one
rollForRune ( bse . genTable , mob ) ;
}
}
}
break ;
break ;
case "ITEM" :
case "ITEM" :
@ -146,60 +138,45 @@ public enum LootManager {
break ;
break ;
}
}
}
}
MobLoot specialDrop = getSpecialDropForMob ( mob ) ;
if ( specialDrop ! = null ) {
enhanceMob ( mob , specialDrop ) ;
}
}
private static void RunBootySetIfPresent ( int bootySet , Mob mob ) {
if ( _bootySetMap . containsKey ( bootySet ) ) {
RunBootySet ( _bootySetMap . get ( bootySet ) , mob ) ;
}
}
private static MobLoot getSpecialDropForMob ( Mob mob ) {
MobLoot specialDrop = null ;
MobLoot specialDrop = null ;
int mobUUID = mob . getObjectUUID ( ) ;
switch ( mob . getObjectUUID ( ) ) {
switch ( mobUUID ) {
case 22595 : //elf 1
case 22595 :
specialDrop = new MobLoot ( mob , ItemBase . getItemBase ( 252134 ) , true ) ;
specialDrop = createSpecialDrop ( mob , 252134 , "Melandrach The Blood-Mage" ) ;
mob . setFirstName ( "Melandrach The Blood-Mage" ) ;
break ;
break ;
case 22432 :
case 22432 : //elf 2
specialDrop = createSpecialDrop ( mob , 252135 , "Kyrtaar The Blood-Mage" ) ;
specialDrop = new MobLoot ( mob , ItemBase . getItemBase ( 252135 ) , true ) ;
mob . setFirstName ( "Kyrtaar The Blood-Mage" ) ;
break ;
break ;
case 22537 :
case 22537 : //elf 3
specialDrop = createSpecialDrop ( mob , 252136 , "Vamir The Blood-Mage" ) ;
specialDrop = new MobLoot ( mob , ItemBase . getItemBase ( 252136 ) , true ) ;
mob . setFirstName ( "Vamir The Blood-Mage" ) ;
break ;
break ;
case 16387 :
case 16387 : //human 4 DONE
specialDrop = createSpecialDrop ( mob , 252129 , "Alatar The Blood-Mage" ) ;
specialDrop = new MobLoot ( mob , ItemBase . getItemBase ( 252129 ) , true ) ;
mob . setFirstName ( "Alatar The Blood-Mage" ) ;
break ;
break ;
case 32724 :
case 32724 : // human 5 GOOD
specialDrop = createSpecialDrop ( mob , 252130 , "Elphaba The Blood-Mage" ) ;
specialDrop = new MobLoot ( mob , ItemBase . getItemBase ( 252130 ) , true ) ;
mob . setFirstName ( "Elphaba The Blood-Mage" ) ;
break ;
break ;
case 23379 :
case 23379 : //human 1 GOOD
specialDrop = createSpecialDrop ( mob , 252131 , "Bavmorda The Blood-Mage" ) ;
specialDrop = new MobLoot ( mob , ItemBase . getItemBase ( 252131 ) , true ) ;
mob . setFirstName ( "Bavmorda The Blood-Mage" ) ;
break ;
break ;
case 10826 :
case 10826 : //human 2 REDO
specialDrop = createSpecialDrop ( mob , 252132 , "Draco The Blood-Mage" ) ;
specialDrop = new MobLoot ( mob , ItemBase . getItemBase ( 252132 ) , true ) ;
mob . setFirstName ( "Draco The Blood-Mage" ) ;
break ;
break ;
case 15929 :
case 15929 : //human 3 GOOD
specialDrop = createSpecialDrop ( mob , 252133 , "Atlantes The Blood-Mage" ) ;
specialDrop = new MobLoot ( mob , ItemBase . getItemBase ( 252133 ) , true ) ;
mob . setFirstName ( "Atlantes The Blood-Mage" ) ;
break ;
break ;
}
}
return specialDrop ;
if ( specialDrop ! = null ) {
}
private static MobLoot createSpecialDrop ( Mob mob , int itemBaseId , String name ) {
mob . setFirstName ( name ) ;
return new MobLoot ( mob , ItemBase . getItemBase ( itemBaseId ) , true ) ;
}
private static void enhanceMob ( Mob mob , MobLoot specialDrop ) {
mob . setLevel ( ( short ) 65 ) ;
mob . setLevel ( ( short ) 65 ) ;
mob . setSpawnTime ( 10800 ) ;
mob . setSpawnTime ( 10800 ) ;
mob . healthMax = 7500 ;
mob . healthMax = ( 7500 ) ;
mob . setHealth ( 7500 ) ;
mob . setHealth ( 7500 ) ;
ChatSystemMsg chatMsg = new ChatSystemMsg ( null , mob . getName ( ) + " in " + mob . getParentZone ( ) . getName ( ) + " has found the " + specialDrop . getName ( ) + ". Are you tough enough to take it?" ) ;
ChatSystemMsg chatMsg = new ChatSystemMsg ( null , mob . getName ( ) + " in " + mob . getParentZone ( ) . getName ( ) + " has found the " + specialDrop . getName ( ) + ". Are you tough enough to take it?" ) ;
chatMsg . setMessageType ( 10 ) ;
chatMsg . setMessageType ( 10 ) ;
@ -208,81 +185,100 @@ public enum LootManager {
mob . getCharItemManager ( ) . addItemToInventory ( specialDrop ) ;
mob . getCharItemManager ( ) . addItemToInventory ( specialDrop ) ;
mob . setResists ( new Resists ( "Dropper" ) ) ;
mob . setResists ( new Resists ( "Dropper" ) ) ;
}
}
}
public static MobLoot getGenTableItem ( int genTableID , AbstractCharacter mob ) {
public static MobLoot getGenTableItem ( int genTableID , AbstractCharacter mob ) {
if ( mob = = null | | ! _genTables . containsKey ( genTableID ) ) {
if ( mob = = null | | _genTables . containsKey ( genTableID ) = = false )
return null ;
return null ;
}
int genRoll = ThreadLocalRandom . current ( ) . nextInt ( 1 , 95 ) ;
MobLoot outItem ;
int genRoll = ThreadLocalRandom . current ( ) . nextInt ( 1 , 94 + 1 ) ;
GenTableEntry selectedRow = GenTableEntry . rollTable ( genTableID , genRoll , 1 . 0f ) ;
GenTableEntry selectedRow = GenTableEntry . rollTable ( genTableID , genRoll , 1 . 0f ) ;
if ( selectedRow = = null | | ! _itemTables . containsKey ( selectedRow . itemTableID ) ) {
if ( selectedRow = = null )
return null ;
return null ;
}
int itemTableRoll = ( mob . getObjectType ( ) . ordinal ( ) = = 52 ) ?
ThreadLocalRandom . current ( ) . nextInt ( 1 , 321 ) :
TableRoll ( mob . level ) ;
ItemTableEntry tableRow = ItemTableEntry . rollTable ( selectedRow . itemTableID , itemTableRoll ) ;
int itemTableId = selectedRow . itemTableID ;
if ( tableRow = = null | | tableRow . cacheID = = 0 ) {
if ( _itemTables . containsKey ( itemTableId ) = = false )
return null ;
return null ;
//gets the 1-320 roll for this mob
int itemTableRoll = 0 ;
int objectType = mob . getObjectType ( ) . ordinal ( ) ;
if ( mob . getObjectType ( ) . ordinal ( ) = = 52 ) { //52 = player character
itemTableRoll = ThreadLocalRandom . current ( ) . nextInt ( 1 , 320 + 1 ) ;
} else {
itemTableRoll = TableRoll ( mob . level ) ;
}
}
ItemTableEntry tableRow = ItemTableEntry . rollTable ( itemTableId , itemTableRoll ) ;
if ( tableRow = = null )
return null ;
int itemUUID = tableRow . cacheID ;
ItemBase itemBase = ItemBase . getItemBase ( tableRow . cacheID ) ;
if ( itemUUID = = 0 )
if ( itemBase = = null ) {
return null ;
return null ;
}
if ( itemBase . getType ( ) = = Enum . ItemType . RESOURCE ) {
if ( ItemBase . getItemBase ( itemUUID ) . getType ( ) . ordinal ( ) = = Enum . ItemType . RESOURCE . ordinal ( ) ) {
if ( ThreadLocalRandom . current ( ) . nextInt ( 1 , 101 ) > 10 ) {
int chance = ThreadLocalRandom . current ( ) . nextInt ( 1 , 101 ) ;
if ( chance > 10 )
return null ;
return null ;
int amount = ThreadLocalRandom . current ( ) . nextInt ( ( int ) ( tableRow . minSpawn * 0 . 5f ) , ( int ) ( ( tableRow . maxSpawn + 1 ) * 0 . 5f ) ) ;
return new MobLoot ( mob , ItemBase . getItemBase ( itemUUID ) , amount , false ) ;
}
}
int amount = ThreadLocalRandom . current ( ) . nextInt ( ( int ) ( tableRow . minSpawn * 0 . 5f ) ,
( int ) ( ( tableRow . maxSpawn + 1 ) * 0 . 5f ) ) ;
return new MobLoot ( mob , itemBase , amount , false ) ;
}
MobLoot outItem = new MobLoot ( mob , itemBase , false ) ;
outItem = new MobLoot ( mob , ItemBase . getItemBase ( itemUUID ) , false ) ;
Enum . ItemType outType = outItem . getItemBase ( ) . getType ( ) ;
if ( selectedRow . pModTable ! = 0 ) {
try {
try {
if ( selectedRow . pModTable ! = 0 ) {
outItem = GeneratePrefix ( mob , outItem , genTableID , genRoll ) ;
outItem = GeneratePrefix ( mob , outItem , genTableID , genRoll ) ;
outItem . setIsID ( false ) ;
outItem . setIsID ( false ) ;
} catch ( Exception e ) {
Logger . error ( "Failed to GeneratePrefix for item: " + outItem . getName ( ) ) ;
}
}
}
if ( selectedRow . sModTable ! = 0 ) {
if ( selectedRow . sModTable ! = 0 ) {
try {
outItem = GenerateSuffix ( mob , outItem , genTableID , genRoll ) ;
outItem = GenerateSuffix ( mob , outItem , genTableID , genRoll ) ;
outItem . setIsID ( false ) ;
outItem . setIsID ( false ) ;
}
} catch ( Exception e ) {
} catch ( Exception e ) {
Logger . error ( "Failed to generate mod for item: " + outItem . getName ( ) , e ) ;
Logger . error ( "Failed to GenerateSuffix for item: " + outItem . getName ( ) ) ;
}
}
}
return outItem ;
return outItem ;
}
}
private static MobLoot GeneratePrefix ( AbstractCharacter mob , MobLoot inItem , int genTableID , int genRoll ) {
private static MobLoot GeneratePrefix ( AbstractCharacter mob , MobLoot inItem , int genTableID , int genRoll ) {
GenTableEntry selectedRow = GenTableEntry . rollTable ( genTableID , genRoll , 1 . 0f ) ;
GenTableEntry selectedRow = GenTableEntry . rollTable ( genTableID , genRoll , 1 . 0f ) ;
if ( selectedRow = = null ) {
return inItem ;
}
ModTypeTableEntry prefixTable = ModTypeTableEntry . rollTable ( selectedRow . pModTable , ThreadLocalRandom . current ( ) . nextInt ( 1 , 101 ) ) ;
if ( selectedRow = = null )
if ( prefixTable = = null ) {
return inItem ;
return inItem ;
}
int prefixTableRoll = ( mob . getObjectType ( ) . ordinal ( ) = = 52 ) ?
int prefixroll = ThreadLocalRandom . current ( ) . nextInt ( 1 , 100 + 1 ) ;
ThreadLocalRandom . current ( ) . nextInt ( 1 , 321 ) :
TableRoll ( mob . level ) ;
ModTableEntry prefixMod = ModTableEntry . rollTable ( prefixTable . modTableID , prefixTableRoll ) ;
ModTypeTableEntry prefixTable = ModTypeTableEntry . rollTable ( selectedRow . pModTable , prefixroll ) ;
if ( prefixMod = = null ) {
if ( prefixTable = = null )
return inItem ;
return inItem ;
int prefixTableRoll = 0 ;
if ( mob . getObjectType ( ) . ordinal ( ) = = 52 ) {
prefixTableRoll = ThreadLocalRandom . current ( ) . nextInt ( 1 , 320 + 1 ) ;
} else {
prefixTableRoll = TableRoll ( mob . level ) ;
}
}
ModTableEntry prefixMod = ModTableEntry . rollTable ( prefixTable . modTableID , prefixTableRoll ) ;
if ( prefixMod = = null )
return inItem ;
if ( ! prefixMod . action . isEmpty ( ) ) {
if ( prefixMod . action . length ( ) > 0 ) {
inItem . setPrefix ( prefixMod . action ) ;
inItem . setPrefix ( prefixMod . action ) ;
inItem . addPermanentEnchantment ( prefixMod . action , 0 , prefixMod . level , true ) ;
inItem . addPermanentEnchantment ( prefixMod . action , 0 , prefixMod . level , true ) ;
}
}
@ -291,26 +287,30 @@ public enum LootManager {
}
}
private static MobLoot GenerateSuffix ( AbstractCharacter mob , MobLoot inItem , int genTableID , int genRoll ) {
private static MobLoot GenerateSuffix ( AbstractCharacter mob , MobLoot inItem , int genTableID , int genRoll ) {
GenTableEntry selectedRow = GenTableEntry . rollTable ( genTableID , genRoll , 1 . 0f ) ;
GenTableEntry selectedRow = GenTableEntry . rollTable ( genTableID , genRoll , 1 . 0f ) ;
if ( selectedRow = = null ) {
return inItem ;
}
ModTypeTableEntry suffixTable = ModTypeTableEntry . rollTable ( selectedRow . sModTable , ThreadLocalRandom . current ( ) . nextInt ( 1 , 101 ) ) ;
if ( selectedRow = = null )
if ( suffixTable = = null ) {
return inItem ;
return inItem ;
}
int suffixTableRoll = ( mob . getObjectType ( ) . ordinal ( ) = = 52 ) ?
int suffixRoll = ThreadLocalRandom . current ( ) . nextInt ( 1 , 100 + 1 ) ;
ThreadLocalRandom . current ( ) . nextInt ( 1 , 321 ) :
TableRoll ( mob . level ) ;
ModTableEntry suffixMod = ModTableEntry . rollTable ( suffixTable . modTableID , suffixTableRoll ) ;
ModTypeTableEntry suffixTable = ModTypeTableEntry . rollTable ( selectedRow . sModTable , suffixRoll ) ;
if ( suffixMod = = null ) {
if ( suffixTable = = null )
return inItem ;
return inItem ;
int suffixTableRoll = 0 ;
if ( mob . getObjectType ( ) . ordinal ( ) = = 52 ) {
suffixTableRoll = ThreadLocalRandom . current ( ) . nextInt ( 1 , 320 + 1 ) ;
} else {
suffixTableRoll = TableRoll ( mob . level ) ;
}
}
ModTableEntry suffixMod = ModTableEntry . rollTable ( suffixTable . modTableID , suffixTableRoll ) ;
if ( suffixMod = = null )
return inItem ;
if ( ! suffixMod . action . isEmpty ( ) ) {
if ( suffixMod . action . length ( ) > 0 ) {
inItem . setSuffix ( suffixMod . action ) ;
inItem . setSuffix ( suffixMod . action ) ;
inItem . addPermanentEnchantment ( suffixMod . action , 0 , suffixMod . level , false ) ;
inItem . addPermanentEnchantment ( suffixMod . action , 0 , suffixMod . level , false ) ;
}
}
@ -319,142 +319,151 @@ public enum LootManager {
}
}
public static int TableRoll ( int mobLevel ) {
public static int TableRoll ( int mobLevel ) {
mobLevel = Math . min ( mobLevel , 65 ) ;
int max = Math . min ( ( int ) ( 4 . 882 * mobLevel + 127 . 0 ) , 319 ) ;
if ( mobLevel > 65 )
int min = Math . max ( ( int ) ( 4 . 469 * mobLevel - 3 . 469 ) , 70 ) ;
mobLevel = 65 ;
int max = ( int ) ( 4 . 882 * mobLevel + 127 . 0 ) ;
if ( max > 319 )
max = 319 ;
int min = ( int ) ( 4 . 469 * mobLevel - 3 . 469 ) ;
return ThreadLocalRandom . current ( ) . nextInt ( min , max + 1 ) ;
if ( min < 70 )
min = 70 ;
int roll = ThreadLocalRandom . current ( ) . nextInt ( min , max + 1 ) ;
return roll ;
}
}
public static void GenerateGoldDrop ( Mob mob , BootySetEntry bse ) {
public static void GenerateGoldDrop ( Mob mob , BootySetEntry bse ) {
int chanceRoll = ThreadLocalRandom . current ( ) . nextInt ( 1 , 101 ) ; // Simplified the chance roll to be out of 100 directly
// Early exit if failed to hit minimum chance roll
int chanceRoll = ThreadLocalRandom . current ( ) . nextInt ( 1 , 100 + 1 ) ;
if ( chanceRoll > bse . dropChance ) {
//early exit, failed to hit minimum chance roll
if ( chanceRoll > bse . dropChance )
return ;
return ;
}
// Determine and add gold to mob inventory
//determine and add gold to mob inventory
int high = ( int ) ( bse . highGold * NORMAL_GOLD_RATE ) ;
int low = ( int ) ( bse . lowGold * NORMAL_GOLD_RATE ) ;
int high = ( int ) ( bse . highGold * NORMAL_GOLD_RATE ) ;
int low = ( int ) ( bse . lowGold * NORMAL_GOLD_RATE ) ;
int gold = ThreadLocalRandom . current ( ) . nextInt ( low , high ) ;
int gold = ThreadLocalRandom . current ( ) . nextInt ( low , high ) ;
if ( gold > 0 ) {
if ( gold > 0 ) {
MobLoot goldAmount = new MobLoot ( mob , gold ) ;
MobLoot goldAmount = new MobLoot ( mob , gold ) ;
mob . getCharItemManager ( ) . addItemToInventory ( goldAmount ) ;
mob . getCharItemManager ( ) . addItemToInventory ( goldAmount ) ;
}
}
}
}
public static void GenerateLootDrop ( Mob mob , int tableID ) {
public static void GenerateLootDrop ( Mob mob , int tableID ) {
if ( mob . parentZone . getSafeZone ( ) = = 1 ) {
return ; // Exit early if in a safe zone
}
try {
try {
if ( mob . parentZone . getSafeZone ( ) = = 1 ) {
return ;
}
MobLoot toAdd = getGenTableItem ( tableID , mob ) ;
MobLoot toAdd = getGenTableItem ( tableID , mob ) ;
if ( toAdd ! = null & & ! isContractOrRune ( toAdd ) ) {
if ( toAdd . getItemBase ( ) . getType ( ) . equals ( Enum . ItemType . CONTRACT ) | | toAdd . getItemBase ( ) . getType ( ) . equals ( Enum . ItemType . RUNE ) )
return ; //block all contracts and runes that drop outside the confines of the new system
if ( toAdd ! = null ) {
toAdd . setIsID ( true ) ;
toAdd . setIsID ( true ) ;
mob . getCharItemManager ( ) . addItemToInventory ( toAdd ) ;
mob . getCharItemManager ( ) . addItemToInventory ( toAdd ) ;
}
}
} catch ( Exception e ) {
} catch ( Exception e ) {
// Handle exceptions if necessary
//TODO chase down loot generation error, affects roughly 2% of drops
}
}
}
}
private static boolean isContractOrRune ( MobLoot loot ) {
Enum . ItemType type = loot . getItemBase ( ) . getType ( ) ;
return type = = Enum . ItemType . CONTRACT | | type = = Enum . ItemType . RUNE ;
}
public static void GenerateEquipmentDrop ( Mob mob ) {
public static void GenerateEquipmentDrop ( Mob mob ) {
if ( mob . parentZone . getSafeZone ( ) = = 1 ) {
if ( mob . parentZone . getSafeZone ( ) = = 1 ) {
return ;
return ;
}
}
//do equipment here
int dropCount = 0 ;
int dropCount = 0 ;
if ( mob . getEquip ( ) ! = null ) {
if ( mob . getEquip ( ) ! = null )
for ( MobEquipment me : mob . getEquip ( ) . values ( ) ) {
for ( MobEquipment me : mob . getEquip ( ) . values ( ) ) {
if ( me . getDropChance ( ) = = 0 ) {
if ( me . getDropChance ( ) = = 0 )
continue ;
continue ;
}
float equipmentRoll = ThreadLocalRandom . current ( ) . nextInt ( 1 , 101 ) ; // Simplified the roll to be out of 100 directly
float equipmentRoll = ThreadLocalRandom . current ( ) . nextInt ( 1 , 100 + 1 ) ;
float dropChance = me . getDropChance ( ) * 100 ;
float dropChance = me . getDropChance ( ) * 100 ;
if ( equipmentRoll > dropChance )
if ( equipmentRoll > dropChance ) {
continue ;
continue ;
}
ItemBase genericIB = me . getItemBase ( ) ;
ItemBase genericIB = me . getItemBase ( ) ;
if ( genericIB . isVorg ( ) ) {
if ( genericIB . isVorg ( ) ) {
genericIB = getRandomVorgPiece ( genericIB ) ; // Replaced separate method calls with a single one
if ( genericIB . isClothArmor ( ) ) {
mob . spawnTime = ThreadLocalRandom . current ( ) . nextInt ( 300 , 2700 ) ;
//get random cloth piece
genericIB = getRandomVorgCloth ( ) ; //ItemBase.getItemBase(vorg_cloth_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_cloth_uuids.size() - 1)));
} else if ( genericIB . isHeavyArmor ( ) ) {
//get random heavy armor piece
genericIB = getRandomVorgHA ( ) ; //ItemBase.getItemBase(vorg_ha_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_ha_uuids.size() - 1)));
} else if ( genericIB . isMediumArmor ( ) ) {
//get random medium armor piece
genericIB = getRandomVorgMA ( ) ; //ItemBase.getItemBase(vorg_ma_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_ma_uuids.size() - 1)));
} else if ( genericIB . isLightArmor ( ) ) {
//get random light armor piece
genericIB = getRandomVorgLA ( ) ; //ItemBase.getItemBase(vorg_la_uuids.get(ThreadLocalRandom.current().nextInt(0,vorg_la_uuids.size() - 1)));
}
mob . spawnTime = ThreadLocalRandom . current ( ) . nextInt ( 300 , 2700 ) ;
}
}
MobLoot ml = new MobLoot ( mob , genericIB , false ) ;
MobLoot ml = new MobLoot ( mob , genericIB , false ) ;
if ( ml ! = null & & dropCount < 1 ) {
if ( ml ! = null & & dropCount < 1 & & genericIB . isVorg ( ) = = false ) {
ml . setIsID ( true ) ;
ml . setIsID ( true ) ;
ml . setDurabilityCurrent ( ( short ) ( ml . getDurabilityCurrent ( ) - ThreadLocalRandom . current ( ) . nextInt ( 5 ) + 1 ) ) ;
ml . setDurabilityCurrent ( ( short ) ( ml . getDurabilityCurrent ( ) - ThreadLocalRandom . current ( ) . nextInt ( 5 ) + 1 ) ) ;
mob . getCharItemManager ( ) . addItemToInventory ( ml ) ;
mob . getCharItemManager ( ) . addItemToInventory ( ml ) ;
dropCount + + ;
dropCount = 1 ;
//break; // Exit on first successful roll.
}
}
if ( ml ! = null & & genericIB . isVorg ( ) & & mob . getMobBaseID ( ) ! = 14062 ) {
if ( ml ! = null & & genericIB . isVorg ( ) & & mob . getMobBaseID ( ) ! = 14062 ) {
ml . setIsID ( true ) ;
ml . setIsID ( true ) ;
ml . setDurabilityCurrent ( ml . getDurabilityMax ( ) ) ;
ml . setDurabilityCurrent ( ml . getDurabilityMax ( ) ) ;
mob . getCharItemManager ( ) . addItemToInventory ( ml ) ;
mob . getCharItemManager ( ) . addItemToInventory ( ml ) ;
}
}
}
}
}
}
}
private static ItemBase getRandomVorgPiece ( ItemBase genericIB ) {
if ( genericIB . isClothArmor ( ) ) {
return getRandomVorgCloth ( ) ;
} else if ( genericIB . isHeavyArmor ( ) ) {
return getRandomVorgHA ( ) ;
} else if ( genericIB . isMediumArmor ( ) ) {
return getRandomVorgMA ( ) ;
} else if ( genericIB . isLightArmor ( ) ) {
return getRandomVorgLA ( ) ;
}
return genericIB ; // Return the original item base if it's not a vorg piece
}
public static void GenerateInventoryDrop ( Mob mob , BootySetEntry bse ) {
public static void GenerateInventoryDrop ( Mob mob , BootySetEntry bse ) {
// Check if the item is a discipline rune
if ( ItemBase . getItemBase ( bse . itemBase ) . isDiscRune ( ) ) {
if ( ItemBase . getItemBase ( bse . itemBase ) . isDiscRune ( ) ) {
if ( ! Mob . disciplineDroppers . contains ( mob ) ) {
if ( ! Mob . disciplineDroppers . contains ( mob ) )
Mob . disciplineDroppers . add ( mob ) ;
Mob . disciplineDroppers . add ( mob ) ;
mob . setResists ( new Resists ( "Dropper" ) ) ;
mob . setResists ( new Resists ( "Dropper" ) ) ;
ChatSystemMsg chatMsg = new ChatSystemMsg ( null , mob . getName ( ) + " in " + mob . getParentZone ( ) . getName ( ) + " has found the " + ItemBase . getItemBase ( bse . itemBase ) . getName ( ) + ". Are you tough enough to take it?" ) ;
ChatSystemMsg chatMsg = new ChatSystemMsg ( null , mob . getName ( ) + " in " + mob . getParentZone ( ) . getName ( ) + " has found the " + ItemBase . getItemBase ( bse . itemBase ) . getName ( ) + ". Are you tough enough to take it?" ) ;
chatMsg . setMessageType ( 10 ) ;
chatMsg . setMessageType ( 10 ) ;
chatMsg . setChannel ( Enum . ChatChannelType . SYSTEM . getChannelID ( ) ) ;
chatMsg . setChannel ( Enum . ChatChannelType . SYSTEM . getChannelID ( ) ) ;
DispatchMessage . dispatchMsgToAll ( chatMsg ) ;
DispatchMessage . dispatchMsgToAll ( chatMsg ) ;
}
}
}
// Skip drop if mob is in a safe zone
//if((bse.itemBase == 3040 || bse.itemBase == 3021) && mob.level < 80){
if ( mob . parentZone . getSafeZone ( ) = = 1 ) {
// chance = 100;
//}
if ( mob . parentZone . getSafeZone ( ) = = 1 ) {
return ;
return ;
}
}
// Roll for drop chance
int chanceRoll = ThreadLocalRandom . current ( ) . nextInt ( 1 , 99 ) ;
int chanceRoll = ThreadLocalRandom . current ( ) . nextInt ( 1 , 100 ) ; // Changed upper bound to 100
// Check if the chance roll exceeds drop chance
//early exit, failed to hit minimum chance roll
if ( chanceRoll > bse . dropChance ) {
return ; // Early exit if the drop chance fails
if ( chanceRoll > bse . dropChance )
}
return ;
// Create and add the loot item to the mob's inventory
MobLoot lootItem = new MobLoot ( mob , ItemBase . getItemBase ( bse . itemBase ) , true ) ;
MobLoot lootItem = new MobLoot ( mob , ItemBase . getItemBase ( bse . itemBase ) , true ) ;
if ( lootItem ! = null ) {
if ( lootItem ! = null )
mob . getCharItemManager ( ) . addItemToInventory ( lootItem ) ;
mob . getCharItemManager ( ) . addItemToInventory ( lootItem ) ;
}
}
}
public static void peddleFate ( PlayerCharacter playerCharacter , Item gift ) {
public static void peddleFate ( PlayerCharacter playerCharacter , Item gift ) {
@ -540,77 +549,155 @@ public enum LootManager {
itemMan . updateInventory ( ) ;
itemMan . updateInventory ( ) ;
}
}
public static MobLoot rollForContract ( int table , Mob mob ) {
public static MobLoot rollForContract ( int table , Mob mob ) {
mob . parentZone . lastContractDrop = System . currentTimeMillis ( ) ;
int roll = ( table = = 1900 | | table = = 1500 ) ? 73 : 99 ;
int roll = 99 ;
if ( table = = 1900 | | table = = 1500 )
roll = 73 ;
GenTableEntry selectedRow = GenTableEntry . rollTable ( table , roll , 1 . 0f ) ;
GenTableEntry selectedRow = GenTableEntry . rollTable ( table , roll , 1 . 0f ) ;
if ( selectedRow = = null ) {
if ( selectedRow = = null )
return null ;
return null ;
}
int itemTableId = selectedRow . itemTableID ;
int itemTableId = selectedRow . itemTableID ;
if ( ! _itemTables . containsKey ( itemTableId ) ) {
if ( _itemTables . containsKey ( itemTableId ) = = false )
return null ;
return null ;
}
ItemTableEntry tableRow = ItemTableEntry . rollTable ( itemTableId , ThreadLocalRandom . current ( ) . nextInt ( 75 , 321 ) ) ;
if ( tableRow = = null )
return null ;
int itemUUID = tableRow . cacheID ;
ItemTableEntry tableRow = ItemTableEntry . rollTable ( itemTableId , ThreadLocalRandom . current ( ) . nextInt ( 1 , 321 ) ) ;
if ( itemUUID = = 0 )
if ( tableRow = = null | | tableRow . cacheID = = 0 ) {
return null ;
return null ;
}
return new MobLoot ( mob , ItemBase . getItemBase ( tableRow . cacheID ) , false ) ;
MobLoot outItem = new MobLoot ( mob , ItemBase . getItemBase ( itemUUID ) , false ) ;
if ( outItem ! = null ) {
mob . contractCounter = 0 ;
return outItem ;
}
}
public static MobLoot rollForRune ( int table , Mob mob ) {
mob . parentZone . lastRuneDrop = System . currentTimeMillis ( ) ;
int roll = ( table = = 1900 | | table = = 1500 ) ? 77 : 97 ;
GenTableEntry selectedRow = GenTableEntry . rollTable ( table , roll , 1 . 0f ) ;
if ( selectedRow = = null ) {
return null ;
return null ;
}
}
public static MobLoot rollForRune ( int table , Mob mob ) {
int roll = 97 ;
if ( table = = 1900 | | table = = 1500 ) {
roll = 77 ;
}
GenTableEntry selectedRow = GenTableEntry . rollTable ( table , roll , 1 . 0f ) ;
if ( selectedRow = = null )
return null ;
int itemTableId = selectedRow . itemTableID ;
int itemTableId = selectedRow . itemTableID ;
if ( ! _itemTables . containsKey ( itemTableId ) ) {
return null ;
}
ItemTableEntry tableRow = ItemTableEntry . rollTable ( itemTableId , ThreadLocalRandom . current ( ) . nextInt ( 1 , 321 ) ) ;
if ( _itemTables . containsKey ( itemTableId ) = = false )
if ( tableRow = = null | | tableRow . cacheID = = 0 ) {
return null ;
ItemTableEntry tableRow = ItemTableEntry . rollTable ( itemTableId , ThreadLocalRandom . current ( ) . nextInt ( 75 , 321 ) ) ;
if ( tableRow = = null )
return null ;
return null ;
}
return new MobLoot ( mob , ItemBase . getItemBase ( tableRow . cacheID ) , false ) ;
int itemUUID = tableRow . cacheID ;
}
public static MobLoot rollForGlass ( Mob mob ) {
if ( itemUUID = = 0 )
ItemTableEntry tableRow = ItemTableEntry . rollTable ( 126 , ThreadLocalRandom . current ( ) . nextInt ( 1 , 321 ) ) ;
if ( tableRow ! = null & & tableRow . cacheID ! = 0 ) {
return new MobLoot ( mob , ItemBase . getItemBase ( tableRow . cacheID ) , false ) ;
}
return null ;
return null ;
}
public static ItemBase getRandomVorgItem ( int maxRandom , int . . . itemBaseIDs ) {
MobLoot outItem = new MobLoot ( mob , ItemBase . getItemBase ( itemUUID ) , false ) ;
int random = ThreadLocalRandom . current ( ) . nextInt ( maxRandom ) ;
if ( outItem ! = null ) {
int index = random / ( maxRandom / itemBaseIDs . length ) ;
mob . runeCounter = 0 ;
if ( index > = itemBaseIDs . length ) {
return outItem ;
index = itemBaseIDs . length - 1 ;
}
return ItemBase . getItemBase ( itemBaseIDs [ index ] ) ;
}
}
public static ItemBase getRandomVorgCloth ( ) {
return null ;
return getRandomVorgItem ( 100 , 27600 , 188700 , 188720 , 189550 , 189560 ) ;
}
}
public static MobLoot rollForGlass ( Mob mob ) {
ItemTableEntry tableRow = ItemTableEntry . rollTable ( 126 , ThreadLocalRandom . current ( ) . nextInt ( 220 , 321 ) ) ;
if ( tableRow = = null )
return null ;
int itemUUID = tableRow . cacheID ;
if ( itemUUID = = 0 )
return null ;
public static ItemBase getRandomVorgLA ( ) {
MobLoot outItem = new MobLoot ( mob , ItemBase . getItemBase ( itemUUID ) , false ) ;
return getRandomVorgItem ( 160 , 27550 , 27560 , 189100 , 189110 , 189120 , 189130 , 189140 , 189150 ) ;
if ( outItem ! = null )
return outItem ;
return null ;
}
}
public static ItemBase getRandomVorgMA ( ) {
public static ItemBase getRandomVorgCloth ( ) {
return getRandomVorgItem ( 160 , 27570 , 188900 , 188910 , 188920 , 188930 , 188940 , 188950 , 189500 ) ;
int random = ThreadLocalRandom . current ( ) . nextInt ( 100 ) ;
if ( random < 20 )
return ItemBase . getItemBase ( 27600 ) ;
if ( random > 20 & & random < 40 )
return ItemBase . getItemBase ( 188700 ) ;
if ( random > 40 & & random < 60 )
return ItemBase . getItemBase ( 188720 ) ;
if ( random > 60 & & random < 80 )
return ItemBase . getItemBase ( 189550 ) ;
if ( random > 80 )
return ItemBase . getItemBase ( 189560 ) ;
return null ;
}
}
public static ItemBase getRandomVorgHA ( ) {
public static ItemBase getRandomVorgLA ( ) {
return getRandomVorgItem ( 180 , 27580 , 27590 , 188500 , 188510 , 188520 , 188530 , 188540 , 188550 , 189510 ) ;
int random = ThreadLocalRandom . current ( ) . nextInt ( 160 ) ;
if ( random < 20 )
return ItemBase . getItemBase ( 27550 ) ;
if ( random > 20 & & random < 40 )
return ItemBase . getItemBase ( 27560 ) ;
if ( random > 40 & & random < 60 )
return ItemBase . getItemBase ( 189100 ) ;
if ( random > 60 & & random < 80 )
return ItemBase . getItemBase ( 189110 ) ;
if ( random > 80 & & random < 100 )
return ItemBase . getItemBase ( 189120 ) ;
if ( random > 100 & & random < 120 )
return ItemBase . getItemBase ( 189130 ) ;
if ( random > 120 & & random < 140 )
return ItemBase . getItemBase ( 189140 ) ;
if ( random > 140 )
return ItemBase . getItemBase ( 189150 ) ;
return null ;
}
public static ItemBase getRandomVorgMA ( ) {
int random = ThreadLocalRandom . current ( ) . nextInt ( 160 ) ;
if ( random < 20 )
return ItemBase . getItemBase ( 27570 ) ;
if ( random > 20 & & random < 40 )
return ItemBase . getItemBase ( 188900 ) ;
if ( random > 40 & & random < 60 )
return ItemBase . getItemBase ( 188910 ) ;
if ( random > 60 & & random < 80 )
return ItemBase . getItemBase ( 188920 ) ;
if ( random > 80 & & random < 100 )
return ItemBase . getItemBase ( 188930 ) ;
if ( random > 100 & & random < 120 )
return ItemBase . getItemBase ( 188940 ) ;
if ( random > 120 & & random < 140 )
return ItemBase . getItemBase ( 188950 ) ;
if ( random > 140 )
return ItemBase . getItemBase ( 189500 ) ;
return null ;
}
public static ItemBase getRandomVorgHA ( ) {
int random = ThreadLocalRandom . current ( ) . nextInt ( 180 ) ;
if ( random < 20 )
return ItemBase . getItemBase ( 27580 ) ;
if ( random > 20 & & random < 40 )
return ItemBase . getItemBase ( 27590 ) ;
if ( random > 40 & & random < 60 )
return ItemBase . getItemBase ( 188500 ) ;
if ( random > 60 & & random < 80 )
return ItemBase . getItemBase ( 188510 ) ;
if ( random > 80 & & random < 100 )
return ItemBase . getItemBase ( 188520 ) ;
if ( random > 100 & & random < 120 )
return ItemBase . getItemBase ( 188530 ) ;
if ( random > 120 & & random < 140 )
return ItemBase . getItemBase ( 188540 ) ;
if ( random > 140 & & random < 160 )
return ItemBase . getItemBase ( 188550 ) ;
if ( random > 160 )
return ItemBase . getItemBase ( 189510 ) ;
return null ;
}
}
}
}