/**
* Lists all slots of a given type for a given person.
* If player is unspecified, list all slots for the current player.
* @author Jun
*
*/
public static class ListSlot extends CommandExecute {
private MapleInventoryType transType(String type){
if(type.equalsIgnoreCase("equip")){
return MapleInventoryType.EQUIP;
} else if(type.equalsIgnoreCase("equiped")){
return MapleInventoryType.EQUIPPED;
} else if(type.equalsIgnoreCase("cash")){
return MapleInventoryType.CASH;
} else if(type.equalsIgnoreCase("etc")){
return MapleInventoryType.ETC;
} else if(type.equalsIgnoreCase("use")){
return MapleInventoryType.USE;
} else {
return MapleInventoryType.UNDEFINED;
}
}
private MapleCharacter playerByName(MapleClient c, String name){
List<MapleMap> maps = c.getChannelServer().getMapFactory().getAllLoadedMaps();
for(MapleMap map : maps){
MapleCharacter chrFound = map.getCharacterByName(name);
if(chrFound!=null) return chrFound;
}
return null;
}
private void printHeader(MapleCharacter p, String formatString){
String headerString = String.format(formatString, "Unique ID", "Item ID", "Position");
p.dropMessage(6,headerString);
}
public int execute(MapleClient c, String[] args){
MapleCharacter self = c.getPlayer();
//ListSlot <type>
String formatString = "%10s\t%10s\t%10s";
printHeader(self,formatString);
if(args.length<1){
self.dropMessage(6,"!ListSlot <Item Type> [Player]");
return 1;
}
String typeString = args[0];
String playerString = args.length == 2?args[1]:null;
MapleCharacter foundPlayer = playerString==null?self:playerByName(c, playerString);
if(foundPlayer==null){
self.dropMessage(6,"Player not found.");
return 1;
}
MapleInventoryType itemType = transType(typeString);
if(itemType == MapleInventoryType.UNDEFINED){
self.dropMessage(6, "Item type undefined.");
return 1;
}
MapleInventory inventory = foundPlayer.getInventory(itemType);
Collection<Item> items = inventory.list();
for(Item item:items){
//possible enhancement, change display of item type id to item type name.
String itemString = String.format(formatString, item.getUniqueId(), item.getItemId(), item.getPosition());
self.dropMessage(6, itemString);
}
return 0;
}
}
public static class AlterPotential extends CommandExecute {
private Equip findEquip(MapleCharacter owner, short position) throws ClassCastException{
return (Equip)owner.getInventory(MapleInventoryType.EQUIP).getItem(position);
}
private short findFirstAvailablePotentialLine(Equip equip, short requestLine){
int p1=equip.getPotential1(),p2=equip.getPotential2(),
p3=equip.getPotential3(),p4=equip.getPotential4(),
p5=equip.getPotential5();
//simply replace if potential is already set.
switch(requestLine){
case 1: if(p1>=0) return requestLine;
case 2: if(p2>=0) return requestLine;
case 3: if(p3>=0) return requestLine;
case 4: if(p4>=0) return requestLine;
case 5: if(p5>=0) return requestLine;
}
//otherwise, add to the first empty line
if(p1<=0) return 1;
else if(p2<=0) return 2;
else if(p3<=0) return 3;
else if(p4<=0) return 4;
else return 5;
}
@Override
public int execute(MapleClient c, String[] args){
String helpString = "!AlterPotential <item position> <potential id> <req level> <potential line> [item owner]";
MapleCharacter self = c.getPlayer();
//see InventoryHandler.UseMagnify
final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
try{
String posStr = args[0];
String potIdStr = args[1];
String reqLevelStr = args[2];
String potLineStr = args[3];
String itemOwnerStr = args.length>=5?args[4]:null;
MapleCharacter itemOwner = self;
if(itemOwnerStr!=null){
itemOwner = self.getMap().getCharacterByName(itemOwnerStr);
}
if(itemOwner == null){
self.dropMessage(6, "Player not found.");
return 1;
}
List<StructItemOption> potGrades = ii.getPotentialInfo(Integer.parseInt(potIdStr));
int reqLevel = Integer.parseInt(reqLevelStr)/10;
StructItemOption pot = potGrades.get(reqLevel);
//find item
Equip equip = findEquip(itemOwner,Short.parseShort(posStr));
short potLine = Short.parseShort(potLineStr);
potLine = findFirstAvailablePotentialLine(equip, potLine);
switch(potLine){
case 1: equip.setPotential1(pot.opID); break;
case 2: equip.setPotential2(pot.opID); break;
case 3: equip.setPotential3(pot.opID); break;
case 4: equip.setPotential4(pot.opID); break;
case 5: equip.setPotential5(pot.opID); break;
}
//TODO: Send update info to player and save to database.
//See CWvsContext.scrolledItem and SendOP for information.
c.getPlayer().getMap().broadcastMessage(CField.showPotentialReset(false, c.getPlayer().getId(), true, equip.getItemId()));
// c.getSession().write(InventoryPacket.scrolledItem(toUse, item, false, true));
c.getPlayer().forceReAddItem_NoUpdate(equip, MapleInventoryType.EQUIP);
c.getPlayer().reloadC();
MapleInventoryManipulator.addById(c, 2430481, (short) 1, "Cube" + " on " + FileoutputUtil.CurrentReadable_Date());
return 0;
} catch (ArrayIndexOutOfBoundsException e){
self.dropMessage(6, helpString);
return 1;
} catch (ClassCastException e){
self.dropMessage(6, "Required Level must be a number.");
return 1;
} catch (NumberFormatException e){
self.dropMessage(6, "Entered NaN into a number argument.");
return 1;
}
}
}