package com.planet_ink.coffee_mud.Commands;
import com.planet_ink.coffee_mud.core.interfaces.*;
import com.planet_ink.coffee_mud.core.*;
import com.planet_ink.coffee_mud.core.collections.*;
import com.planet_ink.coffee_mud.Abilities.interfaces.*;
import com.planet_ink.coffee_mud.Areas.interfaces.*;
import com.planet_ink.coffee_mud.Behaviors.interfaces.*;
import com.planet_ink.coffee_mud.CharClasses.interfaces.*;
import com.planet_ink.coffee_mud.Commands.interfaces.*;
import com.planet_ink.coffee_mud.Common.interfaces.*;
import com.planet_ink.coffee_mud.Common.interfaces.Session.InputCallback;
import com.planet_ink.coffee_mud.Exits.interfaces.*;
import com.planet_ink.coffee_mud.Items.interfaces.*;
import com.planet_ink.coffee_mud.Locales.interfaces.*;
import com.planet_ink.coffee_mud.Libraries.interfaces.*;
import com.planet_ink.coffee_mud.Libraries.interfaces.CatalogLibrary.CataData;
import com.planet_ink.coffee_mud.Libraries.interfaces.CatalogLibrary.CatalogKind;
import com.planet_ink.coffee_mud.MOBS.interfaces.*;
import com.planet_ink.coffee_mud.Races.interfaces.*;
import java.util.*;
/*
Copyright 2007-2016 Bo Zimmerman
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
@SuppressWarnings({"unchecked","rawtypes"})
public class Catalog extends StdCommand
{
public Catalog(){}
private final String[] access = I(new String[] { "CATALOG" });
@Override
public String[] getAccessWords()
{
return access;
}
protected TreeMap<String,String> currentCats=new TreeMap<String,String>();
public boolean catalog(Room R, MOB mob, Physical P)
throws java.io.IOException
{
final Physical origP=P;
final Physical cataP=CMLib.catalog().getCatalogObj(P);
if((!(P instanceof DBIdentifiable))
||(!((DBIdentifiable)P).canSaveDatabaseID()))
{
mob.tell(L("The object '@x1' can not be cataloged.",P.Name()));
return false;
}
String newCat=currentCats.get(mob.Name());
if(newCat==null)
newCat="";
String msg="<S-NAME> catalog(s) <T-NAMESELF> into category '"+newCat+"'.";
final CataData data=CMLib.catalog().getCatalogData(cataP);
final String oldCat=(data!=null)?data.category():"";
final String catagory=(data!=null)?" in category '"+oldCat+"'":"";
/*
if(CMLib.flags().isCataloged(P))
{
mob.tell(L("The object '@x1' is already cataloged@x2.",P.Name(),catagory));
return false;
}
*/
if(cataP!=null)
{
CMLib.catalog().changeCatalogUsage(P,true);
final StringBuffer diffs=CMLib.catalog().checkCatalogIntegrity(P);
if((diffs==null)||(diffs.length()==0))
{
if((data!=null)&&(!data.category().equals(newCat)))
{
if((mob.session()==null)
||(!mob.session().confirm(L("The object '@x1' already exists in the catalog@x2 , exactly as it is. Would you like to change it to category '@x3'(y/N)?",cataP.Name(),catagory,newCat),"N")))
{
return false;
}
else
{
CMLib.catalog().updateCatalogCategory(cataP,newCat);
return true;
}
}
else
{
mob.tell(L("The object '@x1' already exists in the catalog@x2 , exactly as it is.",cataP.Name(),catagory));
return true;
}
}
if((data!=null)&&(!data.category().equals(newCat)))
diffs.insert(0,"New category: '"+newCat+"', ");
if((mob.session()==null)
||(!mob.session().confirm(L("Cataloging that object will change the existing cataloged '@x1'@x2 by altering the following properties: @x3. Please confirm (y/N)?",P.Name(),catagory,diffs.toString()),"Y")))
{
CMLib.catalog().changeCatalogUsage(origP,false);
return false;
}
msg="<S-NAME> modif(ys) the cataloged version of <T-NAMESELF>.";
if((data!=null)&&(!data.category().equals(newCat)))
CMLib.catalog().updateCatalogCategory(cataP,newCat);
}
else
CMLib.catalog().addCatalog(newCat,P);
CMLib.catalog().updateCatalog(P);
R.show(mob,P,CMMsg.MSG_OK_VISUAL,msg);
return true;
}
public Physical findCatalog(CatalogKind whatKind, String ID, boolean exactOnly)
{
final Object[] data=new Object[]{null,null};
if((data[0]==null)&&((whatKind==CatalogKind.OBJECT)||(whatKind==CatalogKind.MOB)))
{
data[0] = CMLib.catalog().getCatalogMob(ID);
if (data[0] != null)
data[1] = Integer.valueOf(1);
}
if((data[0]==null)&&((whatKind==CatalogKind.OBJECT)||(whatKind==CatalogKind.ITEM)))
{
data[0] = CMLib.catalog().getCatalogItem(ID);
if (data[0] != null)
data[1] = Integer.valueOf(2);
}
if(exactOnly)
return (Physical)data[0];
if((data[0]==null)&&((whatKind==CatalogKind.OBJECT)||(whatKind==CatalogKind.MOB)))
{
final String[] names=CMLib.catalog().getCatalogMobNames().clone();
for (final String name : names)
{
if(CMLib.english().containsString(name, ID))
{
data[0] = CMLib.catalog().getCatalogMob(name);
data[1] = Integer.valueOf(1);
break;
}
}
if(data[0] == null)
{
for(int s=0;s<names.length;s++)
names[s] = CMStrings.removeColors(names[s]);
for (final String name : names)
{
if(ID.equalsIgnoreCase(name))
{
data[0] = CMLib.catalog().getCatalogMob(name);
data[1] = Integer.valueOf(1);
break;
}
}
if(data[0] == null)
{
for (final String name : names)
{
if(CMLib.english().containsString(name, ID))
{
data[0] = CMLib.catalog().getCatalogMob(name);
data[1] = Integer.valueOf(1);
break;
}
}
}
}
}
if((data[0]==null)&&((whatKind==CatalogKind.OBJECT)||(whatKind==CatalogKind.ITEM)))
{
final String[] names=CMLib.catalog().getCatalogItemNames().clone();
for (final String name : names)
{
if(CMLib.english().containsString(name, ID))
{
data[0] = CMLib.catalog().getCatalogItem(name);
data[1] = Integer.valueOf(2);
break;
}
}
if(data[0] == null)
{
for(int s=0;s<names.length;s++)
names[s] = CMStrings.removeColors(names[s]);
for (final String name : names)
{
if(ID.equalsIgnoreCase(name))
{
data[0] = CMLib.catalog().getCatalogItem(name);
data[1] = Integer.valueOf(2);
break;
}
}
if(data[0] == null)
{
for (final String name : names)
{
if(CMLib.english().containsString(name, ID))
{
data[0] = CMLib.catalog().getCatalogItem(name);
data[1] = Integer.valueOf(2);
break;
}
}
}
}
}
return (Physical)data[0];
}
public Enumeration getRoomSet(MOB mob, String which)
{
Enumeration rooms=null;
if(which.equalsIgnoreCase("ROOM"))
rooms=new XVector(CMLib.map().getExtendedRoomID(mob.location())).elements();
else
if(which.equalsIgnoreCase("AREA"))
rooms=mob.location().getArea().getProperRoomnumbers().getRoomIDs();
else
if(which.equalsIgnoreCase("WORLD"))
rooms=CMLib.map().roomIDs();
return rooms;
}
public CatalogKind getObjectType(List<String> commands)
{
CatalogKind whatKind=CatalogKind.OBJECT;
if((commands.size()>0)&&("MOBS".startsWith(commands.get(0).toUpperCase().trim())))
{
commands.remove(0);
whatKind = CatalogKind.MOB;
}
if((commands.size()>0)&&("ITEMS".startsWith(commands.get(0).toUpperCase().trim())))
{
commands.remove(0);
whatKind = CatalogKind.ITEM;
}
return whatKind;
}
public boolean checkUserRoomSetEntry(List<String> commands)
{
if(commands.size()==0)
return false;
if((commands.get(0).equalsIgnoreCase("ROOM"))
||(commands.get(0).equalsIgnoreCase("AREA"))
||(commands.get(0).equalsIgnoreCase("WORLD")))
return true;
return false;
}
protected String listCatagories(CatalogKind whatKind)
{
StringBuilder list = new StringBuilder("");
List<CatalogKind> types = new ArrayList<CatalogKind>();
if((whatKind==CatalogKind.OBJECT)||(whatKind==CatalogKind.MOB))
types.add(CatalogKind.MOB);
if((whatKind==CatalogKind.OBJECT)||(whatKind==CatalogKind.MOB))
types.add(CatalogKind.ITEM);
for(CatalogKind kind : types)
{
list.append(L("\n\r^H"+CMStrings.capitalizeAndLower(kind.name()).trim()+" categories:"));
list.append("\n\r"+CMStrings.repeat('-',78)+"^?\n\r");
List<String> cats;
switch(kind)
{
case MOB:
cats=Arrays.asList(CMLib.catalog().getMobCatalogCatagories());
break;
case ITEM:
default:
cats=Arrays.asList(CMLib.catalog().getItemCatalogCatagories());
break;
}
for(String c : cats)
list.append(c+"\n\r");
list.append("\n\r");
}
return list.toString();
}
@Override
public boolean execute(final MOB mob, List<String> commands, int metaFlags)
throws java.io.IOException
{
Room R=mob.location();
if(R==null)
return false;
if((commands!=null)&&(commands.size()>1))
{
commands.remove(0);
if(checkUserRoomSetEntry(commands))
{
final String which=commands.get(0).toLowerCase();
final Enumeration rooms=getRoomSet(mob,which);
commands.remove(0);
final CatalogKind whatKind=getObjectType(commands);
final String type=whatKind.name().toLowerCase();
if((mob.session()!=null)
&&(mob.session().confirm(L("You are about to auto-catalog (room-reset and save) all @x1 @x2.\n\rThis command, if used improperly, may alter @x3 in this @x4.\n\rAre you absolutely sure (y/N)?",which,type,type,which),"N"))
&&((which.equalsIgnoreCase("ROOM"))||mob.session().confirm(L("I'm serious now. You can't abort this, and it WILL modify stuff.\n\rHave you tested this command on small areas and know what you're doing?.\n\rAre you absolutely POSITIVELY sure (y/N)?"),"N")))
{
Physical P=null;
String roomID=null;
for(;rooms.hasMoreElements();)
{
roomID=(String)rooms.nextElement();
R=CMLib.coffeeMaker().makeNewRoomContent(CMLib.map().getRoom(roomID),false);
final List<CatalogLibrary.RoomContent> contents=CMLib.catalog().roomContent(R);
boolean dirty=false;
for(final CatalogLibrary.RoomContent content : contents)
{
P=content.P();
if(P instanceof Coins)
continue;
if((P instanceof MOB)&&(whatKind!=CatalogKind.ITEM))
{
if(catalog(R,mob,P))
{
content.flagDirty();
dirty=true;
}
}
else
if((P instanceof Item)&&(whatKind!=CatalogKind.MOB))
{
if(catalog(R,mob,P))
{
content.flagDirty();
dirty=true;
}
}
}
if(dirty)
{
CMLib.catalog().updateRoomContent(roomID, contents);
CMLib.map().resetRoom(CMLib.map().getRoom(roomID), true);
}
R.destroy();
}
}
}
else
if(commands.get(0).equalsIgnoreCase("CATAGORY")||commands.get(0).equalsIgnoreCase("CATEGORY"))
{
commands.remove(0);
String ID=CMParms.combine(commands,0);
if(ID.equalsIgnoreCase("none"))
{
commands.add("");
ID="";
}
String oldCat=currentCats.get(mob.Name());
if(oldCat == null)
oldCat="";
mob.tell(L("Your current category is '@x1'.",oldCat));
if(commands.size()>0)
{
ID=ID.toUpperCase().trim();
if(ID.length()>0)
{
if(ID.equalsIgnoreCase("LIST"))
{
mob.tell(listCatagories(CatalogKind.OBJECT));
return false;
}
else
if((!CMParms.contains(CMLib.catalog().getItemCatalogCatagories(),ID))
&&(!CMParms.contains(CMLib.catalog().getMobCatalogCatagories(),ID)))
{
final Session session=mob.session();
final String newCat=ID;
if(newCat.equalsIgnoreCase("GLOBAL")||newCat.equalsIgnoreCase("NONE")||newCat.equalsIgnoreCase("UNCATEGORIZED"))
mob.tell(L("That is not a valid new catagory to create."));
else
if(session!=null)
session.prompt(new InputCallback(InputCallback.Type.CONFIRM,"N")
{
@Override
public void showPrompt()
{
session.promptPrint(L("Create new category '@x1' (y/N)?", newCat));
}
@Override
public void timedOut()
{
}
@Override
public void callBack()
{
if(this.confirmed)
{
currentCats.put(mob.Name(), newCat);
mob.tell(L("Your category is now '@x1' for new mob/item catalog additions.",newCat));
mob.tell(L("To change back to the global category, enter CATALOG CATAGORY NONE"));
}
}
});
}
else
{
currentCats.put(mob.Name(), ID);
mob.tell(L("Your category is now '@x1' for new mob/item catalog additions.",ID));
mob.tell(L("To change back to the global category, enter CATALOG CATAGORY NONE"));
}
}
else
{
currentCats.remove(mob.Name());
mob.tell(L("Your category is now '' (the global category)."));
}
}
}
else
if(commands.get(0).equalsIgnoreCase("LIST"))
{
commands.remove(0);
final CatalogKind whatKind=getObjectType(commands);
final String ID=CMParms.combine(commands,0);
final StringBuffer list=new StringBuffer("");
int col=0;
MOB M=null;
Item I=null;
CatalogLibrary.CataData data;
if((ID.equalsIgnoreCase("CATEGORIES")
||ID.equalsIgnoreCase("CATEGORY")
||ID.equalsIgnoreCase("CATAGORIES")
||ID.equalsIgnoreCase("CATAGORY")
||ID.equalsIgnoreCase("CATS")
||ID.equalsIgnoreCase("CAT")))
{
mob.tell(listCatagories(CatalogKind.OBJECT));
return false;
}
else
if((whatKind==CatalogKind.OBJECT)||(whatKind==CatalogKind.MOB))
{
String cat=currentCats.get(mob.Name());
list.append("^HMobs ("+(cat)+")\n\r^N");
list.append(CMStrings.padRight(L("Name"),34)+" ");
list.append(CMStrings.padRight("#",3));
list.append(CMStrings.padRight(L("Name"),34)+" ");
list.append(CMStrings.padRight("#",3));
list.append("\n\r"+CMStrings.repeat('-',78)+"\n\r");
final String[] names=CMLib.catalog().getCatalogMobNames(cat);
for (final String name : names)
{
M=CMLib.catalog().getCatalogMob(name);
if(M!=null)
{
data=CMLib.catalog().getCatalogMobData(name);
if((ID.length()==0)||(CMLib.english().containsString(M.Name(),ID)))
{
list.append(CMStrings.padRight(M.Name(),34)).append(" ");
list.append(CMStrings.padRight(Integer.toString(data.numReferences()),3));
if(col==0)
{
col++;
}
else
{
col++;
list.append("\n\r");
}
}
}
}
list.append("\n\r\n\r");
}
if((whatKind==CatalogKind.OBJECT)||(whatKind==CatalogKind.ITEM))
{
String cat=currentCats.get(mob.Name());
list.append("^HItems ("+(cat)+")\n\r^N");
list.append(CMStrings.padRight(L("Name"),34)+" ");
list.append(CMStrings.padRight("#",3)+" ");
list.append(CMStrings.padRight(L("Rate"),6)+" ");
list.append(CMStrings.padRight(L("Mask"),31)+" ");
list.append("\n\r"+CMStrings.repeat('-',78)+"\n\r");
final String[] names=CMLib.catalog().getCatalogItemNames(cat);
for (final String name : names)
{
I=CMLib.catalog().getCatalogItem(name);
if(I!=null)
{
data=CMLib.catalog().getCatalogItemData(name);
if((ID.length()==0)||(CMLib.english().containsString(I.Name(),ID)))
{
list.append(CMStrings.padRight(I.Name(),34)+" ");
list.append(CMStrings.padRight(Integer.toString(data.numReferences()),3)+" ");
if(data.getRate()<=0.0)
{
list.append("N/A ");
list.append(CMStrings.padRight(" ",31));
}
else
{
list.append(CMStrings.padRight(CMath.toPct(data.getRate()),6)+" ");
list.append(data.getWhenLive()?"L ":"D ");
list.append(CMStrings.padRight(data.getMaskStr(),29));
}
list.append("\n\r");
}
}
}
list.append("\n\r");
}
if(mob.session()!=null)
mob.session().wraplessPrintln(list.toString());
}
else
if(commands.get(0).equalsIgnoreCase("DELETE"))
{
commands.remove(0);
final CatalogKind whatKind=getObjectType(commands);
final String ID=CMParms.combine(commands,0);
Physical[] del=null;
if(ID.equalsIgnoreCase("everydamnmob"))
del=CMLib.catalog().getCatalogMobs();
else
if(ID.equalsIgnoreCase("everydamnitem"))
del=CMLib.catalog().getCatalogItems();
else
if(ID.equalsIgnoreCase("everydamnthing"))
{
final java.util.List<Physical> V=new Vector<Physical>();
V.addAll(Arrays.asList(CMLib.catalog().getCatalogItems()));
V.addAll(Arrays.asList(CMLib.catalog().getCatalogMobs()));
del=V.toArray(new Physical[0]);
}
else
{
final Physical P=findCatalog(whatKind,ID,false);
if(P==null)
{
mob.tell(L("'@x1' not found in catalog! Try CATALOG LIST",ID));
return false;
}
del=new Physical[]{P};
}
for (final Physical P : del)
{
final CatalogLibrary.CataData data=CMLib.catalog().getCatalogData(P);
if(P instanceof MOB)
{
String prefix="";
if((data!=null)&&(data.numReferences()>0))
prefix="Catalog MOB '"+((MOB)P).Name()+"' is currently listed as being in use '"+data.numReferences()+" times. ";
if((mob.session()!=null)
&&((del.length>10)||(mob.session().confirm(L("@x1This will permanently delete mob '@x2' from the catalog. Are you sure (y/N)?",prefix,((MOB)P).Name()),"N"))))
{
CMLib.catalog().delCatalog(P);
mob.tell(L("MOB '@x1 has been permanently removed from the catalog.",((MOB)P).Name()));
}
}
else
if(P instanceof Item)
{
String prefix="";
if((data!=null)&&(data.numReferences()>0))
prefix="Catalog Item '"+((Item)P).Name()+"' is currently listed as being in use '"+data.numReferences()+" times. ";
if((mob.session()!=null)
&&((del.length>10)||(mob.session().confirm(L("@x1This will permanently delete item '@x2' from the catalog. Are you sure (y/N)?",prefix,((Item)P).Name()),"N"))))
{
CMLib.catalog().delCatalog(P);
mob.tell(L("Item '@x1 has been permanently removed from the catalog.",P.Name()));
}
}
}
}
else
if(commands.get(0).equalsIgnoreCase("EDIT"))
{
commands.remove(0);
final CatalogKind whatKind=getObjectType(commands);
final String ID=CMParms.combine(commands,0);
final Physical P=findCatalog(whatKind,ID,false);
if(P==null)
{
mob.tell(L("'@x1' not found in catalog! Try CATALOG LIST",ID));
return false;
}
final CatalogLibrary.CataData data=CMLib.catalog().getCatalogData(P);
if(P instanceof MOB)
{
mob.tell(L("There is no extra mob data to edit. See help on CATALOG."));
}
else
if(P instanceof Item)
{
if(mob.session()!=null)
{
Double newPct=null;
while(newPct == null)
{
final String newRate=mob.session().prompt(L("Enter a new Drop Rate or 0% to disable (@x1): ",CMath.toPct(data.getRate())), CMath.toPct(data.getRate()));
if(newRate.trim().length()==0)
return false;
else
if(CMath.isPct(newRate))
newPct=Double.valueOf(CMath.s_pct(newRate));
else
mob.tell(L("'@x1' is not a valid percentage value. Try something like 10%",newRate));
}
data.setRate(newPct.doubleValue());
if(data.getRate()<=0.0)
{
data.setMaskStr("");
data.setRate(0.0);
CMLib.database().DBUpdateItem("CATALOG_ITEMS",(Item)P);
Log.sysOut("Catalog",mob.Name()+" modified catalog item "+P.Name());
mob.tell(L("No drop item."));
return false;
}
final String choice=mob.session().choose(L("Is this for L)ive mobs or D)ead ones (@x1): ",(data.getWhenLive()?"L":"D")),L("LD"), (data.getWhenLive()?"L":"D"));
data.setWhenLive(choice.equalsIgnoreCase("L"));
String newMask="?";
while(newMask.equalsIgnoreCase("?"))
{
newMask=mob.session().prompt(L("Enter new MOB selection mask, or NULL (@x1)\n\r: ",data.getMaskStr()),data.getMaskStr());
if(newMask.equalsIgnoreCase("?"))
mob.tell(CMLib.masking().maskHelp("\n","disallow"));
}
if((newMask.length()==0)||(newMask.equalsIgnoreCase("null")))
{
data.setMaskStr("");
data.setRate(0.0);
mob.tell(L("Mask removed."));
}
else
{
data.setMaskStr(newMask);
}
CMLib.database().DBUpdateItem("CATALOG_ITEMS",(Item)P);
Log.sysOut("Catalog",mob.Name()+" modified catalog item "+P.Name());
mob.tell(L("Item '@x1 has been updated.",P.Name()));
}
}
}
else
if((commands.get(0).equalsIgnoreCase("SCAN"))
||(commands.get(0).equalsIgnoreCase("DBSCAN")))
{
final boolean db=commands.get(0).toUpperCase().startsWith("DB");
commands.remove(0);
if(checkUserRoomSetEntry(commands))
{
final String which=commands.get(0).toLowerCase();
final Enumeration rooms=getRoomSet(mob,which);
commands.remove(0);
final CatalogKind whatKind=getObjectType(commands);
Physical P=null;
String roomID=null;
for(;rooms.hasMoreElements();)
{
roomID=(String)rooms.nextElement();
R=CMLib.map().getRoom(roomID);
if(db)
R=CMLib.coffeeMaker().makeNewRoomContent(R,false);
final List<CatalogLibrary.RoomContent> contents=CMLib.catalog().roomContent(R);
for(final CatalogLibrary.RoomContent content : contents)
{
P=content.P();
if(P instanceof Coins)
continue;
if((P instanceof MOB)
&&(whatKind!=CatalogKind.ITEM)
&&(CMLib.flags().isCataloged(P)))
{
if(CMLib.catalog().getCatalogObj(P)!=null)
mob.tell(L("Check: MOB @x1 in @x2 is cataloged.",P.Name(),roomID));
else
mob.tell(L("Error: MOB @x1 in @x2 is falsely cataloged.",P.Name(),roomID));
}
if((P instanceof Item)
&&(whatKind!=CatalogKind.MOB)
&&(CMLib.flags().isCataloged(P)))
{
if(CMLib.catalog().getCatalogObj(P)!=null)
mob.tell(L("Check: Item @x1 in @x2 is cataloged.",P.Name(),roomID));
else
mob.tell(L("Error: Item @x1 in @x2 is falsely cataloged.",P.Name(),roomID));
}
}
if(db)
R.destroy();
}
}
else
mob.tell(L("Scan what?"));
}
else
if((commands.get(0).equalsIgnoreCase("OVERLOOK"))
||(commands.get(0).equalsIgnoreCase("DBOVERLOOK")))
{
final boolean db=commands.get(0).toUpperCase().startsWith("DB");
commands.remove(0);
if(checkUserRoomSetEntry(commands))
{
final String which=commands.get(0).toLowerCase();
final Enumeration rooms=getRoomSet(mob,which);
commands.remove(0);
final CatalogKind whatKind=getObjectType(commands);
Environmental E=null;
String roomID=null;
for(;rooms.hasMoreElements();)
{
roomID=(String)rooms.nextElement();
R=CMLib.map().getRoom(roomID);
if(R == null)
continue;
if(db)
R=CMLib.coffeeMaker().makeNewRoomContent(R,false);
final List<CatalogLibrary.RoomContent> contents=CMLib.catalog().roomContent(R);
for(final CatalogLibrary.RoomContent content : contents)
{
E=content.P();
if(E instanceof Coins)
continue;
if((E instanceof MOB)
&&(whatKind!=CatalogKind.ITEM)
&&(!CMLib.flags().isCataloged(E)))
{
if(CMLib.catalog().getCatalogMob(E.Name())!=null)
mob.tell(L("MOB @x1 in @x2 should be tied to the catalog.",E.Name(),roomID));
else
mob.tell(L("MOB @x1 in @x2 is not cataloged.",E.Name(),roomID));
}
if((E instanceof Item)
&&(whatKind!=CatalogKind.MOB)
&&(!CMLib.flags().isCataloged(E)))
{
if(CMLib.catalog().getCatalogItem(E.Name())!=null)
mob.tell(L("Item @x1 in @x2 should be tied to the catalog.",E.Name(),roomID));
else
mob.tell(L("Item @x1 in @x2 is not cataloged.",E.Name(),roomID));
}
}
if(db && (R!=null))
R.destroy();
}
}
else
mob.tell(L("Scan what?"));
}
else
if(commands.get(0).equalsIgnoreCase("CLEAN"))
{
commands.remove(0);
if(checkUserRoomSetEntry(commands))
{
final String which=commands.get(0).toLowerCase();
final Enumeration rooms=getRoomSet(mob,which);
commands.remove(0);
final CatalogKind whatKind=getObjectType(commands);
final String type=whatKind.name().toLowerCase();
if((mob.session()!=null)
&&(mob.session().confirm(L("You are about to auto-clean (and auto-save) all @x1 @x2.\n\rThis command, if used improperly, may alter @x3 in this @x4.\n\rAre you absolutely sure (y/N)?",which,type,type,which),"N")))
{
Physical P=null;
String roomID=null;
for(;rooms.hasMoreElements();)
{
roomID=(String)rooms.nextElement();
R=CMLib.coffeeMaker().makeNewRoomContent(CMLib.map().getRoom(roomID),false);
final List<CatalogLibrary.RoomContent> contents=CMLib.catalog().roomContent(R);
boolean dirty=false;
for(final CatalogLibrary.RoomContent content : contents)
{
P=content.P();
if(P instanceof Coins)
continue;
if((P instanceof MOB)
&&(whatKind!=CatalogKind.ITEM))
{
if((CMLib.flags().isCataloged(P))
&&(CMLib.catalog().getCatalogObj(P)==null))
{
CMLib.catalog().changeCatalogUsage(P,false);
content.flagDirty();
dirty=true;
mob.tell(L("MOB @x1 in @x2 was cleaned.",P.Name(),roomID));
}
}
else
if((P instanceof Item)
&&(whatKind!=CatalogKind.MOB))
{
if((CMLib.flags().isCataloged(P))
&&(CMLib.catalog().getCatalogObj(P)==null))
{
CMLib.catalog().changeCatalogUsage(P,false);
content.flagDirty();
dirty=true;
mob.tell(L("Item @x1 in @x2 was cleaned.",P.Name(),roomID));
}
}
}
if(dirty)
{
CMLib.catalog().updateRoomContent(roomID, contents);
CMLib.map().resetRoom(CMLib.map().getRoom(roomID), true);
}
R.destroy();
}
}
}
else
mob.tell(L("Clean what?"));
}
else
{
Physical P=null;
final String ID=CMParms.combine(commands,0);
if(ID.equalsIgnoreCase("SELF")||ID.equalsIgnoreCase("ME"))
P=mob;
if(P==null)
P=R.fetchFromRoomFavorMOBs(null,ID);
if(P!=null)
{
if(!catalog(R,mob,P))
return false;
if((P instanceof DBIdentifiable)
&&(((DBIdentifiable)P).canSaveDatabaseID())
&&(((DBIdentifiable)P).databaseID().length()>0))
{
final Room startRoom=CMLib.map().getStartRoom(P);
if(startRoom !=null)
{
if(P instanceof MOB)
CMLib.database().DBUpdateMOB(startRoom.roomID(),(MOB)P);
else
CMLib.database().DBUpdateItem(startRoom.roomID(),(Item)P);
}
}
}
else
mob.tell(L("You don't see '@x1' here!",ID));
}
}
else
mob.tell(L("Catalog huh? Try CATALOG LIST (MOBS/ITEMS/CATEGORIES) (MASK), CATALOG [mob/item name], CATALOG DELETE [mob/item name], CATALOG EDIT [item name], CATALOG CATEGORY LIST/[category name]."));
return false;
}
@Override
public boolean canBeOrdered()
{
return false;
}
@Override
public boolean securityCheck(MOB mob)
{
return CMSecurity.isAllowed(mob, mob.location(), CMSecurity.SecFlag.CATALOG);
}
}