@ -24,9 +24,19 @@ public class simulateBootyCmd extends AbstractDevCmd {
@@ -24,9 +24,19 @@ public class simulateBootyCmd extends AbstractDevCmd {
if ( pc = = null ) {
return ;
}
int iterations = 100 ;
String newline = "\r\n " ;
if ( words [ 1 ] . length ( ) > 0 ) {
try {
iterations = Integer . parseInt ( words [ 1 ] ) ;
} catch ( Exception ex ) {
iterations = 100 ;
}
}
boolean isZone = false ;
if ( words [ 2 ] . length ( ) > 0 & & words [ 2 ] . toLowerCase ( ) . equals ( "zone" ) ) {
isZone = true ;
}
try {
int targetID = Integer . parseInt ( words [ 0 ] ) ;
Building b = BuildingManager . getBuilding ( targetID ) ;
@ -45,13 +55,10 @@ public class simulateBootyCmd extends AbstractDevCmd {
@@ -45,13 +55,10 @@ public class simulateBootyCmd extends AbstractDevCmd {
+ " Table ID: " + pc . getLastTargetID ( ) ) ;
return ;
}
Enum . GameObjectType objType = target . getObjectType ( ) ;
int objectUUID = target . getObjectUUID ( ) ;
String output ;
output = "Loot Simulation:" + newline ;
output = "Booty Simulation:" + newline ;
switch ( objType ) {
case Building :
@ -74,49 +81,70 @@ public class simulateBootyCmd extends AbstractDevCmd {
@@ -74,49 +81,70 @@ public class simulateBootyCmd extends AbstractDevCmd {
ArrayList < Item > Offerings = new ArrayList < Item > ( ) ;
ArrayList < Item > OtherDrops = new ArrayList < Item > ( ) ;
int failures = 0 ;
for ( int i = 0 ; i < 100 ; + + i ) {
//for(int i = 0; i < iterations; ++i) {
ArrayList < Item > simulatedBooty = new ArrayList < > ( ) ;
if ( isZone = = false ) {
//simulate individual mob booty
simulatedBooty = simulateMobBooty ( mob , iterations ) ;
}
else {
simulatedBooty = simulateZoneBooty ( mob . getParentZone ( ) , iterations ) ;
}
try {
mob . loadInventory ( ) ;
for ( Item lootItem : mob . getCharItemManager ( ) . getInventory ( ) ) {
ItemBase ib = lootItem . getItemBase ( ) ;
int ordinal = ib . getType ( ) . ordinal ( ) ;
switch ( lootItem . getItemBase ( ) . getType ( ) ) {
case CONTRACT : //CONTRACT
Contracts . add ( lootItem ) ;
break ;
case OFFERING : //OFFERING
Offerings . add ( lootItem ) ;
break ;
case RESOURCE : //RESOURCE
Resources . add ( lootItem ) ;
break ;
case RUNE : //RUNE
Runes . add ( lootItem ) ;
break ;
case WEAPON : //WEAPON
if ( lootItem . getItemBase ( ) . isGlass ( ) ) {
GlassItems . add ( lootItem ) ;
} else {
OtherDrops . add ( lootItem ) ;
}
break ;
default :
OtherDrops . add ( lootItem ) ;
break ;
for ( Item lootItem : simulatedBooty ) {
switch ( lootItem . getItemBase ( ) . getType ( ) ) {
case CONTRACT : //CONTRACT
Contracts . add ( lootItem ) ;
break ;
case OFFERING : //OFFERING
Offerings . add ( lootItem ) ;
break ;
case RESOURCE : //RESOURCE
Resources . add ( lootItem ) ;
break ;
case RUNE : //RUNE
Runes . add ( lootItem ) ;
break ;
case WEAPON : //WEAPON
if ( lootItem . getItemBase ( ) . isGlass ( ) ) {
GlassItems . add ( lootItem ) ;
} else {
OtherDrops . add ( lootItem ) ;
}
break ;
default :
OtherDrops . add ( lootItem ) ;
break ;
}
}
} catch ( Exception ex ) {
failures + + ;
}
}
//}
output + = "GLASS ITEMS DROPPED: " + GlassItems . size ( ) + newline ;
output + = "RESOURCE STACKS DROPPED: " + Resources . size ( ) + newline ;
output + = "RUNES DROPPED: " + Runes . size ( ) + newline ;
output + = "CONTRACTS DROPPED: " + Contracts . size ( ) + newline ;
output + = "OFFERINGS DROPPED: " + Offerings . size ( ) + newline ;
output + = "OTHERS DROPPED: " + OtherDrops . size ( ) + newline ;
output + = "OTHER ITEM S DROPPED: " + OtherDrops . size ( ) + newline ;
output + = "FAILED ROLLS: " + failures + newline ;
output + = "Glass Drops:" + newline ;
for ( Item glassItem : GlassItems ) {
output + = glassItem . getName ( ) + newline ;
}
output + = "Rune Drops:" + newline ;
for ( Item runeItem : Runes ) {
output + = runeItem . getName ( ) + newline ;
}
output + = "Contract Drops:" + newline ;
for ( Item contractItem : Contracts ) {
output + = contractItem . getName ( ) + newline ;
}
output + = "Resource Drops:" + newline ;
for ( Item resourceItem : Contracts ) {
output + = resourceItem . getName ( ) + newline ;
}
break ;
}
@ -125,69 +153,33 @@ public class simulateBootyCmd extends AbstractDevCmd {
@@ -125,69 +153,33 @@ public class simulateBootyCmd extends AbstractDevCmd {
@Override
protected String _getHelpString ( ) {
return "Gets information on an Object. " ;
return "simulates mob loot X amount of times for mob or zone " ;
}
@Override
protected String _getUsageString ( ) {
return "' /info targetID' " ;
return "' ./simluatebooty <ITERATIONS> <zone or blank> " ;
}
public static ArrayList < MobLoot > SimulateMobLoot ( Mob mob ) {
ArrayList < MobLoot > outList = new ArrayList < > ( ) ;
//determine if mob is in hotzone
boolean inHotzone = ZoneManager . inHotZone ( mob . getLoc ( ) ) ;
//get multiplier form config manager
float multiplier = Float . parseFloat ( ConfigManager . MB_NORMAL_DROP_RATE . getValue ( ) ) ;
if ( inHotzone ) {
//if mob is inside hotzone, use the hotzone gold multiplier form the config instead
multiplier = Float . parseFloat ( ConfigManager . MB_HOTZONE_DROP_RATE . getValue ( ) ) ;
}
//simulate loot 100 times
for ( int i = 0 ; i < 5 ; + + i ) {
//iterate the booty sets
if ( mob . getMobBase ( ) . bootySet ! = 0 & & NPCManager . _bootySetMap . containsKey ( mob . getMobBase ( ) . bootySet ) ) {
try {
ArrayList < MobLoot > testList = RunBootySet ( NPCManager . _bootySetMap . get ( mob . getMobBase ( ) . bootySet ) , mob , multiplier , inHotzone ) ;
for ( MobLoot lootItem : testList ) {
outList . add ( ( lootItem ) ) ;
}
} catch ( Exception ex ) {
}
public static ArrayList < Item > simulateMobBooty ( Mob mob , int iterations ) {
ArrayList < Item > producedBooty = new ArrayList < > ( ) ;
for ( int i = 0 ; i < iterations ; + + i ) {
mob . loadInventory ( ) ;
for ( Item lootItem : mob . getCharItemManager ( ) . getInventory ( ) ) {
producedBooty . add ( lootItem ) ;
}
}
return outList ;
return producedBooty ;
}
private static ArrayList < MobLoot > RunBootySet ( ArrayList < BootySetEntry > entries , Mob mob , float multiplier , boolean inHotzone ) {
ArrayList < MobLoot > outList = new ArrayList < > ( ) ;
for ( BootySetEntry bse : entries ) {
switch ( bse . bootyType ) {
case "GOLD" :
break ;
case "LOOT" :
if ( ThreadLocalRandom . current ( ) . nextInt ( 100 ) < = ( bse . dropChance * multiplier ) ) {
//early exit, failed to hit minimum chance roll
break ;
}
//iterate the booty tables and add items to mob inventory
MobLoot toAdd = getGenTableItem ( bse . lootTable , mob ) ;
if ( toAdd ! = null ) {
//mob.getCharItemManager().addItemToInventory(toAdd);
outList . add ( toAdd ) ;
}
if ( inHotzone ) {
int lootTableID = bse . lootTable + 1 ;
MobLoot toAddHZ = getGenTableItem ( lootTableID , mob ) ;
if ( toAddHZ ! = null )
//mob.getCharItemManager().addItemToInventory(toAddHZ);
outList . add ( toAdd ) ;
}
break ;
case "ITEM" :
break ;
public static ArrayList < Item > simulateZoneBooty ( Zone zone , int iterations ) {
ArrayList < Item > producedBooty = new ArrayList < > ( ) ;
for ( Mob mob : zone . zoneMobSet ) {
for ( int i = 0 ; i < iterations ; + + i ) {
mob . loadInventory ( ) ;
for ( Item lootItem : mob . getCharItemManager ( ) . getInventory ( ) ) {
producedBooty . add ( lootItem ) ;
}
}
}
return outList ;
return producedBooty ;
}
}