package com.planet_ink.coffee_mud.core.database;
import com.planet_ink.coffee_mud.core.interfaces.*;
import com.planet_ink.coffee_mud.core.*;
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.Exits.interfaces.*;
import com.planet_ink.coffee_mud.Items.interfaces.*;
import com.planet_ink.coffee_mud.Locales.interfaces.*;
import com.planet_ink.coffee_mud.MOBS.interfaces.*;
import com.planet_ink.coffee_mud.Races.interfaces.*;
import java.sql.*;
import java.util.*;
/*
* Copyright 2000-2006 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.
*/
public class MOBloader
{
protected DBConnector DB=null;
public MOBloader(DBConnector newDB)
{
DB=newDB;
}
protected Room emptyRoom=null;
public boolean DBReadUserOnly(MOB mob)
{
if(mob.Name().length()==0) return false;
boolean found=false;
DBConnection D=null;
try
{
D=DB.DBFetch();
ResultSet R=D.query("SELECT * FROM CMCHAR WHERE CMUSERID='"+mob.Name()+"'");
while(R.next())
{
CharStats stats=mob.baseCharStats();
CharState state=mob.baseState();
PlayerStats pstats=(PlayerStats)CMClass.getCommon("DefaultPlayerStats");
mob.setPlayerStats(pstats);
String username=DBConnections.getRes(R,"CMUSERID");
String password=DBConnections.getRes(R,"CMPASS");
mob.setName(username);
pstats.setPassword(password);
stats.setMyClasses(DBConnections.getRes(R,"CMCLAS"));
stats.setStat(CharStats.STAT_STRENGTH,CMath.s_int(DBConnections.getRes(R,"CMSTRE")));
stats.setMyRace(CMClass.getRace(DBConnections.getRes(R,"CMRACE")));
stats.setStat(CharStats.STAT_DEXTERITY,CMath.s_int(DBConnections.getRes(R,"CMDEXT")));
stats.setStat(CharStats.STAT_CONSTITUTION,CMath.s_int(DBConnections.getRes(R,"CMCONS")));
stats.setStat(CharStats.STAT_GENDER,DBConnections.getRes(R,"CMGEND").charAt(0));
stats.setStat(CharStats.STAT_WISDOM,CMath.s_int(DBConnections.getRes(R,"CMWISD")));
stats.setStat(CharStats.STAT_INTELLIGENCE,CMath.s_int(DBConnections.getRes(R,"CMINTE")));
stats.setStat(CharStats.STAT_CHARISMA,CMath.s_int(DBConnections.getRes(R,"CMCHAR")));
state.setHitPoints(CMath.s_int(DBConnections.getRes(R,"CMHITP")));
stats.setMyLevels(DBConnections.getRes(R,"CMLEVL"));
int level=0;
for(int i=0;i<mob.baseCharStats().numClasses();i++)
level+=stats.getClassLevel(mob.baseCharStats().getMyClass(i));
mob.baseEnvStats().setLevel(level);
state.setMana(CMath.s_int(DBConnections.getRes(R,"CMMANA")));
state.setMovement(CMath.s_int(DBConnections.getRes(R,"CMMOVE")));
mob.setDescription(DBConnections.getRes(R,"CMDESC"));
int align=(CMath.s_int(DBConnections.getRes(R,"CMALIG")));
if((CMLib.factions().getFaction(CMLib.factions().AlignID())!=null)&&(align>=0))
CMLib.factions().setAlignmentOldRange(mob,align);
mob.setExperience(CMath.s_int(DBConnections.getRes(R,"CMEXPE")));
//mob.setExpNextLevel(CMath.s_int(DBConnections.getRes(R,"CMEXLV")));
mob.setWorshipCharID(DBConnections.getRes(R,"CMWORS"));
mob.setPractices(CMath.s_int(DBConnections.getRes(R,"CMPRAC")));
mob.setTrains(CMath.s_int(DBConnections.getRes(R,"CMTRAI")));
mob.setAgeHours(CMath.s_long(DBConnections.getRes(R,"CMAGEH")));
mob.setMoney(CMath.s_int(DBConnections.getRes(R,"CMGOLD")));
mob.setWimpHitPoint(CMath.s_int(DBConnections.getRes(R,"CMWIMP")));
mob.setQuestPoint(CMath.s_int(DBConnections.getRes(R,"CMQUES")));
String roomID=DBConnections.getRes(R,"CMROID");
if(roomID==null) roomID="";
int x=roomID.indexOf("||");
if(x>=0)
{
mob.setLocation(CMLib.map().getRoom(roomID.substring(x+2)));
roomID=roomID.substring(0,x);
}
mob.setStartRoom(CMLib.map().getRoom(roomID));
pstats.setLastDateTime(CMath.s_long(DBConnections.getRes(R,"CMDATE")));
pstats.setChannelMask((int)DBConnections.getLongRes(R,"CMCHAN"));
mob.baseEnvStats().setAttackAdjustment(CMath.s_int(DBConnections.getRes(R,"CMATTA")));
mob.baseEnvStats().setArmor(CMath.s_int(DBConnections.getRes(R,"CMAMOR")));
mob.baseEnvStats().setDamage(CMath.s_int(DBConnections.getRes(R,"CMDAMG")));
mob.setBitmap(CMath.s_int(DBConnections.getRes(R,"CMBTMP")));
mob.setLiegeID(DBConnections.getRes(R,"CMLEIG"));
mob.baseEnvStats().setHeight((int)DBConnections.getLongRes(R,"CMHEIT"));
mob.baseEnvStats().setWeight((int)DBConnections.getLongRes(R,"CMWEIT"));
pstats.setPrompt(DBConnections.getRes(R,"CMPRPT"));
String colorStr=DBConnections.getRes(R,"CMCOLR");
if((colorStr!=null)&&(colorStr.length()>0)&&(!colorStr.equalsIgnoreCase("NULL"))) pstats.setColorStr(colorStr);
pstats.setLastIP(DBConnections.getRes(R,"CMLSIP"));
mob.setClanID(DBConnections.getRes(R,"CMCLAN"));
mob.setClanRole((int)DBConnections.getLongRes(R,"CMCLRO"));
pstats.setEmail(DBConnections.getRes(R,"CMEMAL"));
String buf=DBConnections.getRes(R,"CMPFIL");
pstats.setXML(buf);
stats.setSavesFromString(DBConnections.getRes(R,"CMSAVE"));
Vector V9=CMParms.parseSemicolons(CMLib.xml().returnXMLValue(buf,"TATTS"),true);
while(mob.numTattoos()>0)
mob.delTattoo(mob.fetchTattoo(0));
for(int v=0;v<V9.size();v++)
mob.addTattoo((String)V9.elementAt(v));
V9=CMParms.parseSemicolons(CMLib.xml().returnXMLValue(buf,"EDUS"),true);
while(mob.numExpertises()>0)
mob.delExpertise(mob.fetchExpertise(0));
for(int v=0;v<V9.size();v++)
mob.addExpertise((String)V9.elementAt(v));
if(pstats.getBirthday()==null)
stats.setStat(CharStats.STAT_AGE,
pstats.initializeBirthday((int)Math.round(CMath.div(mob.getAgeHours(),60.0)),stats.getMyRace()));
mob.setImage(CMLib.xml().returnXMLValue(buf,"IMG"));
Vector CleanXML=CMLib.xml().parseAllXML(DBConnections.getRes(R,"CMMXML"));
CMLib.coffeeMaker().setFactionFromXML(mob,CleanXML);
found=true;
}
}catch(Exception sqle)
{
Log.errOut("MOB",sqle);
}
if(D!=null) DB.DBDone(D);
return found;
}
public void DBRead(MOB mob)
{
if(mob.Name().length()==0) return;
if(emptyRoom==null) emptyRoom=CMClass.getLocale("StdRoom");
int oldDisposition=mob.baseEnvStats().disposition();
mob.baseEnvStats().setDisposition(EnvStats.IS_NOT_SEEN|EnvStats.IS_SNEAKING);
mob.envStats().setDisposition(EnvStats.IS_NOT_SEEN|EnvStats.IS_SNEAKING);
DBReadUserOnly(mob);
Room oldLoc=mob.location();
boolean inhab=false;
if(oldLoc!=null) inhab=oldLoc.isInhabitant(mob);
mob.setLocation(emptyRoom);
DBConnection D=null;
// now grab the items
try
{
D=DB.DBFetch();
ResultSet R=D.query("SELECT * FROM CMCHIT WHERE CMUSERID='"+mob.Name()+"'");
Hashtable itemNums=new Hashtable();
Hashtable itemLocs=new Hashtable();
while(R.next())
{
String itemNum=DBConnections.getRes(R,"CMITNM");
String itemID=DBConnections.getRes(R,"CMITID");
Item newItem=CMClass.getItem(itemID);
if(newItem==null)
Log.errOut("MOB","Couldn't find item '"+itemID+"'");
else
{
itemNums.put(itemNum,newItem);
newItem.setMiscText(DBConnections.getResQuietly(R,"CMITTX"));
String loc=DBConnections.getResQuietly(R,"CMITLO");
if(loc.length()>0)
{
Item container=(Item)itemNums.get(loc);
if(container!=null)
newItem.setContainer(container);
else
itemLocs.put(newItem,loc);
}
newItem.wearAt((int)DBConnections.getLongRes(R,"CMITWO"));
newItem.setUsesRemaining((int)DBConnections.getLongRes(R,"CMITUR"));
newItem.baseEnvStats().setLevel((int)DBConnections.getLongRes(R,"CMITLV"));
newItem.baseEnvStats().setAbility((int)DBConnections.getLongRes(R,"CMITAB"));
newItem.baseEnvStats().setHeight((int)DBConnections.getLongRes(R,"CMHEIT"));
newItem.recoverEnvStats();
mob.addInventory(newItem);
}
}
for(Enumeration e=itemLocs.keys();e.hasMoreElements();)
{
Item keyItem=(Item)e.nextElement();
String location=(String)itemLocs.get(keyItem);
Item container=(Item)itemNums.get(location);
if(container!=null)
{
keyItem.setContainer(container);
keyItem.recoverEnvStats();
container.recoverEnvStats();
}
}
}catch(Exception sqle)
{
Log.errOut("MOB",sqle);
}
if(D!=null) DB.DBDone(D);
D=null;
mob.setLocation(oldLoc);
if(inhab&&(!oldLoc.isInhabitant(mob))) oldLoc.addInhabitant(mob);
// now grab the abilities
try
{
D=DB.DBFetch();
ResultSet R=D.query("SELECT * FROM CMCHAB WHERE CMUSERID='"+mob.Name()+"'");
while(R.next())
{
String abilityID=DBConnections.getRes(R,"CMABID");
int proficiency=(int)DBConnections.getLongRes(R,"CMABPF");
if(proficiency==Integer.MIN_VALUE)
{
Behavior newBehavior=CMClass.getBehavior(abilityID);
if(newBehavior==null)
Log.errOut("MOB","Couldn't find behavior '"+abilityID+"'");
else
{
newBehavior.setParms(DBConnections.getRes(R,"CMABTX"));
mob.addBehavior(newBehavior);
}
}else
{
Ability newAbility=CMClass.getAbility(abilityID);
if(newAbility==null)
Log.errOut("MOB","Couldn't find ability '"+abilityID+"'");
else
{
if((proficiency<0)||(proficiency==Integer.MAX_VALUE))
{
if(proficiency==Integer.MAX_VALUE)
{
newAbility.setProficiency(100);
mob.addNonUninvokableEffect(newAbility);
newAbility.setMiscText(DBConnections.getRes(R,"CMABTX"));
}else
{
proficiency=proficiency+200;
newAbility.setProficiency(proficiency);
newAbility.setMiscText(DBConnections.getRes(R,"CMABTX"));
Ability newAbility2=(Ability)newAbility.copyOf();
mob.addNonUninvokableEffect(newAbility);
newAbility2.recoverEnvStats();
mob.addAbility(newAbility2);
}
}else
{
newAbility.setProficiency(proficiency);
newAbility.setMiscText(DBConnections.getRes(R,"CMABTX"));
newAbility.recoverEnvStats();
mob.addAbility(newAbility);
}
}
}
}
}catch(Exception sqle)
{
Log.errOut("MOB",sqle);
}
if(D!=null) DB.DBDone(D);
D=null;
mob.baseEnvStats().setDisposition(oldDisposition);
mob.recoverCharStats();
mob.recoverEnvStats();
mob.recoverMaxState();
mob.resetToMaxState();
if(mob.baseCharStats()!=null)
{
mob.baseCharStats().getCurrentClass().startCharacter(mob,false,true);
int oldWeight=mob.baseEnvStats().weight();
int oldHeight=mob.baseEnvStats().height();
mob.baseCharStats().getMyRace().startRacing(mob,true);
if(oldWeight>0) mob.baseEnvStats().setWeight(oldWeight);
if(oldHeight>0) mob.baseEnvStats().setHeight(oldHeight);
}
mob.recoverCharStats();
mob.recoverEnvStats();
mob.recoverMaxState();
mob.resetToMaxState();
// wont add if same name already exists
CMLib.map().addPlayer(mob);
}
public Vector getUserList()
{
DBConnection D=null;
Vector V=new Vector();
try
{
D=DB.DBFetch();
ResultSet R=D.query("SELECT * FROM CMCHAR");
if(R!=null) while(R.next())
{
String username=DBConnections.getRes(R,"CMUSERID");
V.addElement(username);
}
}catch(Exception sqle)
{
Log.errOut("MOB",sqle);
}
if(D!=null) DB.DBDone(D);
return V;
}
public Vector getExtendedUserList()
{
DBConnection D=null;
Vector allUsers=new Vector();
try
{
D=DB.DBFetch();
CharClass C=null;
ResultSet R=D.query("SELECT * FROM CMCHAR");
if(R!=null) while(R.next())
{
Vector thisUser=new Vector();
try
{
thisUser.addElement(DBConnections.getRes(R,"CMUSERID"));
String cclass=DBConnections.getRes(R,"CMCLAS");
int x=cclass.lastIndexOf(";");
if((x>0)&&(x<cclass.length()-2))
{
C=CMClass.getCharClass(cclass.substring(x+1));
if(C!=null) cclass=C.name();
}
thisUser.addElement(cclass);
String rrace=DBConnections.getRes(R,"CMRACE");
Race R2=CMClass.getRace(rrace);
if(R2!=null)
thisUser.addElement(R2.name());
else
thisUser.addElement(rrace);
String lvl=DBConnections.getRes(R,"CMLEVL");
x=lvl.indexOf(";");
int level=0;
while(x>=0)
{
level+=CMath.s_int(lvl.substring(0,x));
lvl=lvl.substring(x+1);
x=lvl.indexOf(";");
}
if(lvl.length()>0) level+=CMath.s_int(lvl);
thisUser.addElement(new Integer(level).toString());
thisUser.addElement(DBConnections.getRes(R,"CMAGEH"));
MOB M=CMLib.map().getPlayer((String)thisUser.firstElement());
if((M!=null)&&(M.lastTickedDateTime()>0))
thisUser.addElement(""+M.lastTickedDateTime());
else
thisUser.addElement(DBConnections.getRes(R,"CMDATE"));
String lsIP=DBConnections.getRes(R,"CMLSIP");
thisUser.addElement(DBConnections.getRes(R,"CMEMAL"));
thisUser.addElement(lsIP);
allUsers.addElement(thisUser);
}catch(Exception e)
{
Log.errOut("MOBloader",e);
}
}
}catch(Exception sqle)
{
Log.errOut("MOB",sqle);
}
if(D!=null) DB.DBDone(D);
return allUsers;
}
public void vassals(MOB mob, String liegeID)
{
DBConnection D=null;
try
{
D=DB.DBFetch();
ResultSet R=D.query("SELECT * FROM CMCHAR WHERE CMLEIG='"+liegeID+"'");
StringBuffer head=new StringBuffer("");
head.append("[");
head.append(CMStrings.padRight("Race",8)+" ");
head.append(CMStrings.padRight("Class",10)+" ");
head.append(CMStrings.padRight("Lvl",4)+" ");
head.append(CMStrings.padRight("Exp/Lvl",17));
head.append("] Character name\n\r");
HashSet done=new HashSet();
if(R!=null) while(R.next())
{
String username=DBConnections.getRes(R,"CMUSERID");
MOB M=CMLib.map().getPlayer(username);
if(M==null)
{
done.add(username);
String cclass=DBConnections.getRes(R,"CMCLAS");
int x=cclass.lastIndexOf(";");
if((x>0)&&(x<cclass.length()-2)) cclass=CMClass.getCharClass(cclass.substring(x+1)).name();
String race=(CMClass.getRace(DBConnections.getRes(R,"CMRACE"))).name();
String lvl=DBConnections.getRes(R,"CMLEVL");
x=lvl.indexOf(";");
int level=0;
while(x>=0)
{
level+=CMath.s_int(lvl.substring(0,x));
lvl=lvl.substring(x+1);
x=lvl.indexOf(";");
}
if(lvl.length()>0) level+=CMath.s_int(lvl);
int exp=CMath.s_int(DBConnections.getRes(R,"CMEXPE"));
int exlv=CMath.s_int(DBConnections.getRes(R,"CMEXLV"));
head.append("[");
head.append(CMStrings.padRight(race,8)+" ");
head.append(CMStrings.padRight(cclass,10)+" ");
head.append(CMStrings.padRight(Integer.toString(level),4)+" ");
head.append(CMStrings.padRight(exp+"/"+exlv,17));
head.append("] "+CMStrings.padRight(username,15));
head.append("\n\r");
}
}
for(Enumeration e=CMLib.map().players();e.hasMoreElements();)
{
MOB M=(MOB)e.nextElement();
if((M.getLiegeID().equals(liegeID))&&(!done.contains(M.Name())))
{
head.append("[");
head.append(CMStrings.padRight(M.charStats().getMyRace().name(),8)+" ");
head.append(CMStrings.padRight(M.charStats().getCurrentClass().name(M.charStats().getCurrentClassLevel()),10)+" ");
head.append(CMStrings.padRight(""+M.envStats().level(),4)+" ");
head.append(CMStrings.padRight(M.getExperience()+"/"+M.getExpNextLevel(),17));
head.append("] "+CMStrings.padRight(M.name(),15));
head.append("\n\r");
}
}
mob.tell(head.toString());
}catch(Exception sqle)
{
Log.errOut("MOB",sqle);
}
if(D!=null) DB.DBDone(D);
}
public void DBReadFollowers(MOB mob, boolean bringToLife)
{
Room location=mob.location();
if(location==null) location=mob.getStartRoom();
DBConnection D=null;
// now grab the followers
try
{
D=DB.DBFetch();
ResultSet R=D.query("SELECT * FROM CMCHFO WHERE CMUSERID='"+mob.Name()+"'");
while(R.next())
{
String MOBID=DBConnections.getRes(R,"CMFOID");
MOB newMOB=CMClass.getMOB(MOBID);
if(newMOB==null)
Log.errOut("MOB","Couldn't find MOB '"+MOBID+"'");
else
{
Room room=(location==null)?newMOB.getStartRoom():location;
newMOB.setStartRoom(room);
newMOB.setLocation(room);
newMOB.setMiscText(DBConnections.getResQuietly(R,"CMFOTX"));
newMOB.baseEnvStats().setLevel(((int)DBConnections.getLongRes(R,"CMFOLV")));
newMOB.baseEnvStats().setAbility((int)DBConnections.getLongRes(R,"CMFOAB"));
newMOB.baseEnvStats().setRejuv(Integer.MAX_VALUE);
newMOB.recoverEnvStats();
newMOB.recoverCharStats();
newMOB.recoverMaxState();
newMOB.resetToMaxState();
newMOB.setFollowing(mob);
if((newMOB.getStartRoom()!=null)
&&(CMLib.law().doesHavePriviledgesHere(mob,newMOB.getStartRoom()))
&&((newMOB.location()==null)
||(!CMLib.law().doesHavePriviledgesHere(mob,newMOB.location()))))
newMOB.setLocation(newMOB.getStartRoom());
if(bringToLife)
{
newMOB.bringToLife(mob.location(),true);
mob.location().showOthers(newMOB,null,CMMsg.MSG_OK_ACTION,"<S-NAME> appears!");
}
}
}
}catch(Exception sqle)
{
Log.errOut("MOB",sqle);
}
if(D!=null) DB.DBDone(D);
}
public void DBUpdateEmail(MOB mob)
{
PlayerStats pstats=mob.playerStats();
if(pstats==null) return;
DB.update("UPDATE CMCHAR SET CMEMAL='"+pstats.getEmail()+"' WHERE CMUSERID='"+mob.Name()+"'");
}
public void DBClanFill(String clan, Vector members, Vector roles, Vector lastDates)
{
DBConnection D=null;
try
{
D=DB.DBFetch();
ResultSet R=D.query("SELECT * FROM CMCHAR where CMCLAN='"+clan+"'");
if(R!=null) while(R.next())
{
String username=DB.getRes(R,"CMUSERID");
long lastDateTime=CMath.s_long(DBConnections.getRes(R,"CMDATE"));
int role=(int)DB.getLongRes(R,"CMCLRO");
members.addElement(username);
roles.addElement(new Integer(role));
MOB M=CMLib.map().getPlayer(username);
if((M!=null)&&(M.lastTickedDateTime()>0))
lastDates.addElement(new Long(M.lastTickedDateTime()));
else
lastDates.addElement(new Long(lastDateTime));
}
}catch(Exception sqle)
{
Log.errOut("MOB",sqle);
}
if(D!=null) DB.DBDone(D);
}
public void DBUpdateClan(String name, String clan, int role)
{
MOB M=CMLib.map().getPlayer(name);
if(M!=null)
{
M.setClanID(clan);
M.setClanRole(role);
}
DB.update("UPDATE CMCHAR SET CMCLAN='"+clan+"', CMCLRO="+role+" WHERE CMUSERID='"+name+"'");
}
public void DBUpdate(MOB mob)
{
DBUpdateJustMOB(mob);
if((mob.Name().length()==0)||(mob.playerStats()==null)) return;
DBUpdateItems(mob);
DBUpdateAbilities(mob);
mob.playerStats().setUpdated(System.currentTimeMillis());
}
public void DBUpdatePassword(MOB mob)
{
if(mob.Name().length()==0) return;
PlayerStats pstats=mob.playerStats();
if(pstats==null) return;
DB.update("UPDATE CMCHAR SET CMPASS='"+pstats.password()+"' WHERE CMUSERID='"+mob.Name()+"'");
}
public void DBUpdateJustMOB(MOB mob)
{
if(mob.Name().length()==0)
{
DBCreateCharacter(mob);
return;
}
PlayerStats pstats=mob.playerStats();
if(pstats==null) return;
String strStartRoomID=(mob.getStartRoom()!=null)?CMLib.map().getExtendedRoomID(mob.getStartRoom()):"";
String strOtherRoomID=(mob.location()!=null)?CMLib.map().getExtendedRoomID(mob.location()):"";
StringBuffer pfxml=new StringBuffer(pstats.getXML());
if(mob.numTattoos()>0)
{
pfxml.append("<TATTS>");
for(int i=0;i<mob.numTattoos();i++)
pfxml.append(mob.fetchTattoo(i)+";");
pfxml.append("</TATTS>");
}
if(mob.numExpertises()>0)
{
pfxml.append("<EDUS>");
for(int i=0;i<mob.numExpertises();i++)
pfxml.append(mob.fetchExpertise(i)+";");
pfxml.append("</EDUS>");
}
pfxml.append(CMLib.xml().convertXMLtoTag("IMG",mob.rawImage()));
StringBuffer cleanXML=new StringBuffer();
cleanXML.append(CMLib.coffeeMaker().getFactionXML(mob));
DB.update("UPDATE CMCHAR SET CMPASS='"+pstats.password()+"'"
+", CMCLAS='"+mob.baseCharStats().getMyClassesStr()+"'"
+", CMSTRE="+mob.baseCharStats().getStat(CharStats.STAT_STRENGTH)
+", CMRACE='"+mob.baseCharStats().getMyRace().ID()+"'"
+", CMDEXT="+mob.baseCharStats().getStat(CharStats.STAT_DEXTERITY)
+", CMCONS="+mob.baseCharStats().getStat(CharStats.STAT_CONSTITUTION)
+", CMGEND='"+((char)mob.baseCharStats().getStat(CharStats.STAT_GENDER))+"'"
+", CMWISD="+mob.baseCharStats().getStat(CharStats.STAT_WISDOM)
+", CMINTE="+mob.baseCharStats().getStat(CharStats.STAT_INTELLIGENCE)
+", CMCHAR="+mob.baseCharStats().getStat(CharStats.STAT_CHARISMA)
+", CMHITP="+mob.baseState().getHitPoints()
+", CMLEVL='"+mob.baseCharStats().getMyLevelsStr()+"'"
+", CMMANA="+mob.baseState().getMana()
+", CMMOVE="+mob.baseState().getMovement()
+", CMALIG=-1"
+", CMEXPE="+mob.getExperience()
+", CMEXLV="+mob.getExpNextLevel()
+", CMWORS='"+mob.getWorshipCharID()+"'"
+", CMPRAC="+mob.getPractices()
+", CMTRAI="+mob.getTrains()
+", CMAGEH="+mob.getAgeHours()
+", CMGOLD="+mob.getMoney()
+", CMWIMP="+mob.getWimpHitPoint()
+", CMQUES="+mob.getQuestPoint()
+", CMROID='"+strStartRoomID+"||"+strOtherRoomID+"'"
+", CMDATE='"+pstats.lastDateTime()+"'"
+", CMCHAN="+pstats.getChannelMask()
+", CMATTA="+mob.baseEnvStats().attackAdjustment()
+", CMAMOR="+mob.baseEnvStats().armor()
+", CMDAMG="+mob.baseEnvStats().damage()
+", CMBTMP="+mob.getBitmap()
+", CMLEIG='"+mob.getLiegeID()+"'"
+", CMHEIT="+mob.baseEnvStats().height()
+", CMWEIT="+mob.baseEnvStats().weight()
+", CMPRPT='"+pstats.getPrompt()+"'"
+", CMCOLR='"+pstats.getColorStr()+"'"
+", CMCLAN='"+mob.getClanID()+"'"
+", CMLSIP='"+pstats.lastIP()+"'"
+", CMCLRO="+mob.getClanRole()
+", CMEMAL='"+pstats.getEmail()+"'"
+", CMPFIL='"+pfxml.toString()+"'"
+", CMSAVE='"+mob.baseCharStats().getSavesAsString()+"'"
+", CMMXML='"+cleanXML.toString()+"'"
+" WHERE CMUSERID='"+mob.Name()+"'");
DB.update("UPDATE CMCHAR SET CMDESC='"+mob.description()+"' WHERE CMUSERID='"+mob.Name()+"'");
}
private void DBUpdateContents(MOB mob, Vector V)
{
Vector done=new Vector();
for(int i=0;i<mob.inventorySize();i++)
{
Item thisItem=mob.fetchInventory(i);
if((thisItem!=null)&&(!done.contains(""+thisItem))&&(thisItem.savable()))
{
String str="INSERT INTO CMCHIT (CMUSERID, CMITNM, CMITID, CMITTX, CMITLO, CMITWO, "
+"CMITUR, CMITLV, CMITAB, CMHEIT"
+") values ('"+mob.Name()+"','"+(thisItem)+"','"+thisItem.ID()+"','"+thisItem.text()+" ','"
+((thisItem.container()!=null)?(""+thisItem.container()):"")+"',"+thisItem.rawWornCode()+","
+thisItem.usesRemaining()+","+thisItem.baseEnvStats().level()+","+thisItem.baseEnvStats().ability()+","
+thisItem.baseEnvStats().height()+")";
if(!V.contains(str)) V.addElement(str);
done.addElement(""+thisItem);
}
}
}
public void DBUpdateItems(MOB mob)
{
if(mob.Name().length()==0) return;
DB.update("DELETE FROM CMCHIT WHERE CMUSERID='"+mob.Name()+"'");
try
{
Thread.sleep(mob.inventorySize());
}catch(Exception e)
{}
if(DB.queryRows("SELECT * FROM CMCHIT WHERE CMUSERID='"+mob.Name()+"'")>0) Log.errOut("Failed to update items for mob "+mob.Name()+".");
Vector V=new Vector();
if(mob.inventorySize()>0) DBUpdateContents(mob,V);
for(int v=0;v<V.size();v++)
DB.update((String)V.elementAt(v));
}
public void DBUpdateFollowers(MOB mob)
{
if((mob==null)||(mob.Name().length()==0)) return;
DB.update("DELETE FROM CMCHFO WHERE CMUSERID='"+mob.Name()+"'");
if(DB.queryRows("SELECT * FROM CMCHFO WHERE CMUSERID='"+mob.Name()+"'")>0) Log.errOut("Failed to update followers for mob "+mob.Name()+".");
Vector V=new Vector();
for(int f=0;f<mob.numFollowers();f++)
{
MOB thisMOB=mob.fetchFollower(f);
if((thisMOB!=null)&&(thisMOB.isMonster())&&(!thisMOB.isPossessing()))
{
String str="INSERT INTO CMCHFO (CMUSERID, CMFONM, CMFOID, CMFOTX, CMFOLV, CMFOAB"
+") values ('"+mob.Name()+"',"+f+",'"+CMClass.classID(thisMOB)+"','"+thisMOB.text()+" ',"
+thisMOB.baseEnvStats().level()+","+thisMOB.baseEnvStats().ability()+")";
V.addElement(str);
}
}
for(int v=0;v<V.size();v++)
DB.update((String)V.elementAt(v));
}
public void DBDelete(MOB mob)
{
if(mob.Name().length()==0) return;
Vector channels=CMLib.channels().getFlaggedChannelNames("PLAYERPURGES");
for(int i=0;i<channels.size();i++)
CMLib.commands().postChannel((String)channels.elementAt(i),mob.getClanID(),mob.Name()+" has just been deleted.",true);
CMLib.coffeeTables().bump(mob,CoffeeTableRow.STAT_PURGES);
DB.update("DELETE FROM CMCHAR WHERE CMUSERID='"+mob.Name()+"'");
while(mob.inventorySize()>0)
{
Item thisItem=mob.fetchInventory(0);
if(thisItem!=null)
{
thisItem.setContainer(null);
mob.delInventory(thisItem);
}
}
DBUpdateItems(mob);
while(mob.numFollowers()>0)
{
MOB follower=mob.fetchFollower(0);
if(follower!=null) follower.setFollowing(null);
}
DBUpdateFollowers(mob);
while(mob.numLearnedAbilities()>0)
{
Ability A=mob.fetchAbility(0);
if(A!=null) mob.delAbility(A);
}
DBUpdateAbilities(mob);
CMLib.database().DBDeletePlayerJournals(mob.Name());
CMLib.database().DBDeletePlayerData(mob.Name());
}
public void DBUpdateAbilities(MOB mob)
{
if(mob.Name().length()==0) return;
DB.update("DELETE FROM CMCHAB WHERE CMUSERID='"+mob.Name()+"'");
if(DB.queryRows("SELECT * FROM CMCHAB WHERE CMUSERID='"+mob.Name()+"'")>0) Log.errOut("Failed to update abilities for mob "+mob.Name()+".");
Vector V=new Vector();
HashSet H=new HashSet();
for(int a=0;a<mob.numLearnedAbilities();a++)
{
Ability thisAbility=mob.fetchAbility(a);
if((thisAbility!=null)&&(thisAbility.savable()))
{
int proficiency=thisAbility.proficiency();
Ability effectA=mob.fetchEffect(thisAbility.ID());
if(effectA!=null)
{
if((effectA.savable())&&(!effectA.canBeUninvoked())&&(!effectA.isAutoInvoked())) proficiency=proficiency-200;
}
H.add(thisAbility.ID());
String str="INSERT INTO CMCHAB (CMUSERID, CMABID, CMABPF,CMABTX"
+") values ('"+mob.Name()+"','"+thisAbility.ID()+"',"+proficiency+",'"+thisAbility.text()+"')";
V.addElement(str);
}
}
for(int a=0;a<mob.numEffects();a++)
{
Ability thisAffect=mob.fetchEffect(a);
if((thisAffect!=null)&&(!H.contains(thisAffect.ID()))&&(thisAffect.savable())&&(!thisAffect.canBeUninvoked()))
{
String str="INSERT INTO CMCHAB (CMUSERID, CMABID, CMABPF,CMABTX"
+") values ('"+mob.Name()+"','"+thisAffect.ID()+"',"+Integer.MAX_VALUE+",'"+thisAffect.text()+"')";
V.addElement(str);
}
}
for(int b=0;b<mob.numBehaviors();b++)
{
Behavior thisBehavior=mob.fetchBehavior(b);
if((thisBehavior!=null)&&(thisBehavior.isSavable()))
{
String str="INSERT INTO CMCHAB (CMUSERID, CMABID, CMABPF,CMABTX"
+") values ('"+mob.Name()+"','"+thisBehavior.ID()+"',"+Integer.MIN_VALUE+",'"+thisBehavior.getParms()+"'"
+")";
V.addElement(str);
}
}
for(int v=0;v<V.size();v++)
DB.update((String)V.elementAt(v));
}
public void DBCreateCharacter(MOB mob)
{
if(mob.Name().length()==0) return;
PlayerStats pstats=mob.playerStats();
if(pstats==null) return;
DB.update("INSERT INTO CMCHAR (CMUSERID, CMPASS, CMCLAS, CMRACE, CMGEND "
+") VALUES ('"+mob.Name()+"','"+pstats.password()+"','"+mob.baseCharStats().getMyClassesStr()
+"','"+mob.baseCharStats().getMyRace().ID()+"','"+((char)mob.baseCharStats().getStat(CharStats.STAT_GENDER))
+"')");
}
public boolean DBUserSearch(MOB mob, String Login)
{
DBConnection D=null;
boolean returnable=false;
if(mob!=null)
{
if(mob.playerStats()==null) mob.setPlayerStats((PlayerStats)CMClass.getCommon("DefaultPlayerStats"));
mob.setName("");
mob.playerStats().setPassword("");
}
try
{
D=DB.DBFetch();
ResultSet R=D.query("SELECT * FROM CMCHAR");
if(R!=null) while(R.next())
{
String username=DB.getRes(R,"CMUSERID");
if(Login.equalsIgnoreCase(username))
{
returnable=true;
if(mob!=null)
{
String password=DB.getRes(R,"CMPASS");
String email=DB.getRes(R,"CMEMAL");
mob.setName(username);
mob.playerStats().setPassword(password);
mob.playerStats().setEmail(email);
// Acct Exp Code
String buf=DBConnections.getRes(R,"CMPFIL");
if(CMLib.xml().returnXMLValue(buf,"ACCTEXP").length()>0)
mob.playerStats().setAccountExpiration(CMath.s_long(CMLib.xml().returnXMLValue(buf,"ACCTEXP")));
else
{
Calendar C=Calendar.getInstance();
C.add(Calendar.DATE,15);
mob.playerStats().setAccountExpiration(C.getTimeInMillis());
}
}
break;
}
}
}catch(Exception sqle)
{
Log.errOut("MOB",sqle);
}
if(D!=null) DB.DBDone(D);
return returnable;
}
public String[] DBFetchEmailData(String name)
{
String[] data=new String[2];
for(Enumeration e=CMLib.map().players();e.hasMoreElements();)
{
MOB M=(MOB)e.nextElement();
if((M.Name().equalsIgnoreCase(name))&&(M.playerStats()!=null))
{
data[0]=M.playerStats().getEmail();
data[1]=""+((M.getBitmap()&MOB.ATT_AUTOFORWARD)==MOB.ATT_AUTOFORWARD);
return data;
}
}
DBConnection D=null;
try
{
D=DB.DBFetch();
ResultSet R=D.query("SELECT * FROM CMCHAR WHERE CMUSERID='"+name+"'");
if(R!=null) while(R.next())
{
// String username=DB.getRes(R,"CMUSERID");
int btmp=CMath.s_int(DB.getRes(R,"CMBTMP"));
String temail=DB.getRes(R,"CMEMAL");
DB.DBDone(D);
data[0]=temail;
data[1]=""+((btmp&MOB.ATT_AUTOFORWARD)==MOB.ATT_AUTOFORWARD);
return data;
}
}catch(Exception sqle)
{
Log.errOut("MOB",sqle);
}
if(D!=null) DB.DBDone(D);
return null;
}
public String DBEmailSearch(String email)
{
DBConnection D=null;
for(Enumeration e=CMLib.map().players();e.hasMoreElements();)
{
MOB M=(MOB)e.nextElement();
if((M.playerStats()!=null)&&(M.playerStats().getEmail().equalsIgnoreCase(email))) return M.Name();
}
try
{
D=DB.DBFetch();
ResultSet R=D.query("SELECT * FROM CMCHAR");
if(R!=null) while(R.next())
{
String username=DB.getRes(R,"CMUSERID");
String temail=DB.getRes(R,"CMEMAL");
if(temail.equalsIgnoreCase(email))
{
DB.DBDone(D);
return username;
}
}
}catch(Exception sqle)
{
Log.errOut("MOB",sqle);
}
if(D!=null) DB.DBDone(D);
return null;
}
}