/**
* License
* THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS
* CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE").
* THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW.
* ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR
* COPYRIGHT LAW IS PROHIBITED.
*
* BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND
* AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE
* MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED
* HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
*
*/
package l1j.server.server.storage.mysql;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.logging.Level;
import java.util.logging.Logger;
import l1j.server.L1DatabaseFactory;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.storage.CharacterStorage;
import l1j.server.server.utils.SQLUtil;
public class MySqlCharacterStorage implements CharacterStorage {
private static Logger _log = Logger.getLogger(MySqlCharacterStorage.class
.getName());
@Override
public L1PcInstance loadCharacter(String charName) {
L1PcInstance pc = null;
Connection con = null;
PreparedStatement pstm = null;
ResultSet rs = null;
try {
con = L1DatabaseFactory.getInstance().getConnection();
pstm = con
.prepareStatement("SELECT * FROM characters WHERE char_name=?");
pstm.setString(1, charName);
rs = pstm.executeQuery();
if (!rs.next()) {
/*
* SELECTが結果を返さなかった。
*/
return null;
}
pc = new L1PcInstance();
pc.setAccountName(rs.getString("account_name"));
pc.setId(rs.getInt("objid"));
pc.setName(rs.getString("char_name"));
pc.setBirthday((Timestamp) rs.getTimestamp("birthday"));
pc.setHighLevel(rs.getInt("HighLevel"));
pc.setExp(rs.getInt("Exp"));
pc.addBaseMaxHp(rs.getShort("MaxHp"));
short currentHp = rs.getShort("CurHp");
if (currentHp < 1) {
currentHp = 1;
}
pc.setCurrentHpDirect(currentHp);
pc.setDead(false);
pc.setStatus(0);
pc.addBaseMaxMp(rs.getShort("MaxMp"));
pc.setCurrentMpDirect(rs.getShort("CurMp"));
pc.addBaseStr(rs.getByte("Str"));
pc.addBaseCon(rs.getByte("Con"));
pc.addBaseDex(rs.getByte("Dex"));
pc.addBaseCha(rs.getByte("Cha"));
pc.addBaseInt(rs.getByte("Intel"));
pc.addBaseWis(rs.getByte("Wis"));
int status = rs.getInt("Status");
pc.setCurrentWeapon(status);
int classId = rs.getInt("Class");
pc.setClassId(classId);
pc.setTempCharGfx(classId);
pc.setGfxId(classId);
pc.set_sex(rs.getInt("Sex"));
pc.setType(rs.getInt("Type"));
int head = rs.getInt("Heading");
if (head > 7) {
head = 0;
}
pc.setHeading(head);
/*
* int locX = resultset.getInt("locX"); int locY =
* resultset.getInt("locY"); short map =
* resultset.getShort("MapID"); if (locX < 30000 || locX > 40000 ||
* locY < 30000 || locY > 40000) { locX = 32564; locY = 32955; } if
* (map == 70) { locX = 32828; locY = 32848; } // 強制移動 short
* moveflag = Config.RANGE_RACE_RECOGNIT; if (moveflag != 1) {
* Random random = new Random(); // 強制移動 int rndmap = 1 +
* random.nextInt(5); switch (rndmap) { case 1: // skt locX = 33080;
* locY = 33392; map = 4; break;
*
* case 2: // ti locX = 32580; locY = 32931; map = 0; break;
*
* case 3: // wb locX = 32621; locY = 33169; map = 4; break;
*
* case 4: // kent locX = 33050; locY = 32780; map = 4; break;
*
* case 5: // h locX = 33612; locY = 33268; map = 4; break;
*
* default: // skt locX = 33080; locY = 33392; map = 4; break; } }
* pc.set_x(locX); pc.set_y(locY); pc.set_map(map);
*/
pc.setX(rs.getInt("locX"));
pc.setY(rs.getInt("locY"));
pc.setMap(rs.getShort("MapID"));
pc.set_food(rs.getInt("Food"));
pc.setLawful(rs.getInt("Lawful"));
pc.setTitle(rs.getString("Title"));
pc.setClanid(rs.getInt("ClanID"));
pc.setClanname(rs.getString("Clanname"));
pc.setClanRank(rs.getInt("ClanRank"));
pc.setBonusStats(rs.getInt("BonusStatus"));
pc.setElixirStats(rs.getInt("ElixirStatus"));
pc.setElfAttr(rs.getInt("ElfAttr"));
pc.set_PKcount(rs.getInt("PKcount"));
pc.setPkCountForElf(rs.getInt("PkCountForElf"));
pc.setExpRes(rs.getInt("ExpRes"));
pc.setPartnerId(rs.getInt("PartnerID"));
pc.setAccessLevel(rs.getShort("AccessLevel"));
if (pc.getAccessLevel() == 200) {
pc.setGm(true);
pc.setMonitor(false);
} else if (pc.getAccessLevel() == 100) {
pc.setGm(false);
pc.setMonitor(true);
} else {
pc.setGm(false);
pc.setMonitor(false);
}
pc.setOnlineStatus(rs.getInt("OnlineStatus"));
pc.setHomeTownId(rs.getInt("HomeTownID"));
pc.setContribution(rs.getInt("Contribution"));
pc.setPay(rs.getInt("Pay")); // 村莊福利金 此欄位由 HomeTownTimeController 處理 update
pc.setHellTime(rs.getInt("HellTime"));
pc.setBanned(rs.getBoolean("Banned"));
pc.setKarma(rs.getInt("Karma"));
pc.setLastPk(rs.getTimestamp("LastPk"));
pc.setLastPkForElf(rs.getTimestamp("LastPkForElf"));
pc.setDeleteTime(rs.getTimestamp("DeleteTime"));
pc.setOriginalStr(rs.getInt("OriginalStr"));
pc.setOriginalCon(rs.getInt("OriginalCon"));
pc.setOriginalDex(rs.getInt("OriginalDex"));
pc.setOriginalCha(rs.getInt("OriginalCha"));
pc.setOriginalInt(rs.getInt("OriginalInt"));
pc.setOriginalWis(rs.getInt("OriginalWis"));
pc.refresh();
pc.setMoveSpeed(0);
pc.setBraveSpeed(0);
pc.setGmInvis(false);
_log.finest("restored char data: ");
} catch (SQLException e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
return null;
} finally {
SQLUtil.close(rs);
SQLUtil.close(pstm);
SQLUtil.close(con);
}
return pc;
}
@Override
public void createCharacter(L1PcInstance pc) {
Connection con = null;
PreparedStatement pstm = null;
try {
int i = 0;
con = L1DatabaseFactory.getInstance().getConnection();
pstm = con
.prepareStatement("INSERT INTO characters SET account_name=?,objid=?,char_name=?,birthday=?,level=?,HighLevel=?,Exp=?,MaxHp=?,CurHp=?,MaxMp=?,CurMp=?,Ac=?,Str=?,Con=?,Dex=?,Cha=?,Intel=?,Wis=?,Status=?,Class=?,Sex=?,Type=?,Heading=?,LocX=?,LocY=?,MapID=?,Food=?,Lawful=?,Title=?,ClanID=?,Clanname=?,ClanRank=?,BonusStatus=?,ElixirStatus=?,ElfAttr=?,PKcount=?,PkCountForElf=?,ExpRes=?,PartnerID=?,AccessLevel=?,OnlineStatus=?,HomeTownID=?,Contribution=?,Pay=?,HellTime=?,Banned=?,Karma=?,LastPk=?,LastPkForElf=?,DeleteTime=?");
pstm.setString(++i, pc.getAccountName());
pstm.setInt(++i, pc.getId());
pstm.setString(++i, pc.getName());
pstm.setInt(++i, pc.getSimpleBirthday());
pstm.setInt(++i, pc.getLevel());
pstm.setInt(++i, pc.getHighLevel());
pstm.setInt(++i, pc.getExp());
pstm.setInt(++i, pc.getBaseMaxHp());
int hp = pc.getCurrentHp();
if (hp < 1) {
hp = 1;
}
pstm.setInt(++i, hp);
pstm.setInt(++i, pc.getBaseMaxMp());
pstm.setInt(++i, pc.getCurrentMp());
pstm.setInt(++i, pc.getAc());
pstm.setInt(++i, pc.getBaseStr());
pstm.setInt(++i, pc.getBaseCon());
pstm.setInt(++i, pc.getBaseDex());
pstm.setInt(++i, pc.getBaseCha());
pstm.setInt(++i, pc.getBaseInt());
pstm.setInt(++i, pc.getBaseWis());
pstm.setInt(++i, pc.getCurrentWeapon());
pstm.setInt(++i, pc.getClassId());
pstm.setInt(++i, pc.get_sex());
pstm.setInt(++i, pc.getType());
pstm.setInt(++i, pc.getHeading());
pstm.setInt(++i, pc.getX());
pstm.setInt(++i, pc.getY());
pstm.setInt(++i, pc.getMapId());
pstm.setInt(++i, pc.get_food());
pstm.setInt(++i, pc.getLawful());
pstm.setString(++i, pc.getTitle());
pstm.setInt(++i, pc.getClanid());
pstm.setString(++i, pc.getClanname());
pstm.setInt(++i, pc.getClanRank());
pstm.setInt(++i, pc.getBonusStats());
pstm.setInt(++i, pc.getElixirStats());
pstm.setInt(++i, pc.getElfAttr());
pstm.setInt(++i, pc.get_PKcount());
pstm.setInt(++i, pc.getPkCountForElf());
pstm.setInt(++i, pc.getExpRes());
pstm.setInt(++i, pc.getPartnerId());
pstm.setShort(++i, pc.getAccessLevel());
pstm.setInt(++i, pc.getOnlineStatus());
pstm.setInt(++i, pc.getHomeTownId());
pstm.setInt(++i, pc.getContribution());
pstm.setInt(++i, 0);
pstm.setInt(++i, pc.getHellTime());
pstm.setBoolean(++i, pc.isBanned());
pstm.setInt(++i, pc.getKarma());
pstm.setTimestamp(++i, pc.getLastPk());
pstm.setTimestamp(++i, pc.getLastPkForElf());
pstm.setTimestamp(++i, pc.getDeleteTime());
pstm.execute();
_log.finest("stored char data: " + pc.getName());
} catch (SQLException e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
} finally {
SQLUtil.close(pstm);
SQLUtil.close(con);
}
}
@Override
public void deleteCharacter(String accountName, String charName)
throws Exception {
Connection con = null;
PreparedStatement pstm = null;
ResultSet rs = null;
try {
con = L1DatabaseFactory.getInstance().getConnection();
pstm = con
.prepareStatement("SELECT * FROM characters WHERE account_name=? AND char_name=?");
pstm.setString(1, accountName);
pstm.setString(2, charName);
rs = pstm.executeQuery();
if (!rs.next()) {
/*
* SELECTが値を返していない
* 存在しないか、あるいは別のアカウントが所有しているキャラクター名が指定されたということになる。
*/
_log.warning("invalid delete char request: account="
+ accountName + " char=" + charName);
throw new RuntimeException("could not delete character");
}
pstm = con
.prepareStatement("DELETE FROM character_buddys WHERE char_id IN (SELECT objid FROM characters WHERE char_name = ?)");
pstm.setString(1, charName);
pstm.execute();
pstm = con
.prepareStatement("DELETE FROM character_buff WHERE char_obj_id IN (SELECT objid FROM characters WHERE char_name = ?)");
pstm.setString(1, charName);
pstm.execute();
pstm = con
.prepareStatement("DELETE FROM character_config WHERE object_id IN (SELECT objid FROM characters WHERE char_name = ?)");
pstm.setString(1, charName);
pstm.execute();
pstm = con
.prepareStatement("DELETE FROM character_items WHERE char_id IN (SELECT objid FROM characters WHERE char_name = ?)");
pstm.setString(1, charName);
pstm.execute();
pstm = con
.prepareStatement("DELETE FROM character_quests WHERE char_id IN (SELECT objid FROM characters WHERE char_name = ?)");
pstm.setString(1, charName);
pstm.execute();
pstm = con
.prepareStatement("DELETE FROM character_skills WHERE char_obj_id IN (SELECT objid FROM characters WHERE char_name = ?)");
pstm.setString(1, charName);
pstm.execute();
pstm = con
.prepareStatement("DELETE FROM character_teleport WHERE char_id IN (SELECT objid FROM characters WHERE char_name = ?)");
pstm.setString(1, charName);
pstm.execute();
pstm = con
.prepareStatement("DELETE FROM characters WHERE char_name=?");
pstm.setString(1, charName);
pstm.execute();
} catch (SQLException e) {
throw e;
} finally {
SQLUtil.close(rs);
SQLUtil.close(pstm);
SQLUtil.close(con);
}
}
@Override
public void storeCharacter(L1PcInstance pc) {
Connection con = null;
PreparedStatement pstm = null;
try {
int i = 0;
con = L1DatabaseFactory.getInstance().getConnection();
pstm = con
.prepareStatement("UPDATE characters SET level=?,HighLevel=?,Exp=?,MaxHp=?,CurHp=?,MaxMp=?,CurMp=?,Ac=?,Str=?,Con=?,Dex=?,Cha=?,Intel=?,Wis=?,Status=?,Class=?,Sex=?,Type=?,Heading=?,LocX=?,LocY=?,MapID=?,Food=?,Lawful=?,Title=?,ClanID=?,Clanname=?,ClanRank=?,BonusStatus=?,ElixirStatus=?,ElfAttr=?,PKcount=?,PkCountForElf=?,ExpRes=?,PartnerID=?,AccessLevel=?,OnlineStatus=?,HomeTownID=?,Contribution=?,HellTime=?,Banned=?,Karma=?,LastPk=?,LastPkForElf=?,DeleteTime=? WHERE objid=?");
pstm.setInt(++i, pc.getLevel());
pstm.setInt(++i, pc.getHighLevel());
pstm.setInt(++i, pc.getExp());
pstm.setInt(++i, pc.getBaseMaxHp());
int hp = pc.getCurrentHp();
if (hp < 1) {
hp = 1;
}
pstm.setInt(++i, hp);
pstm.setInt(++i, pc.getBaseMaxMp());
pstm.setInt(++i, pc.getCurrentMp());
pstm.setInt(++i, pc.getAc());
pstm.setInt(++i, pc.getBaseStr());
pstm.setInt(++i, pc.getBaseCon());
pstm.setInt(++i, pc.getBaseDex());
pstm.setInt(++i, pc.getBaseCha());
pstm.setInt(++i, pc.getBaseInt());
pstm.setInt(++i, pc.getBaseWis());
pstm.setInt(++i, pc.getCurrentWeapon());
pstm.setInt(++i, pc.getClassId());
pstm.setInt(++i, pc.get_sex());
pstm.setInt(++i, pc.getType());
pstm.setInt(++i, pc.getHeading());
pstm.setInt(++i, pc.getX());
pstm.setInt(++i, pc.getY());
pstm.setInt(++i, pc.getMapId());
pstm.setInt(++i, pc.get_food());
pstm.setInt(++i, pc.getLawful());
pstm.setString(++i, pc.getTitle());
pstm.setInt(++i, pc.getClanid());
pstm.setString(++i, pc.getClanname());
pstm.setInt(++i, pc.getClanRank());
pstm.setInt(++i, pc.getBonusStats());
pstm.setInt(++i, pc.getElixirStats());
pstm.setInt(++i, pc.getElfAttr());
pstm.setInt(++i, pc.get_PKcount());
pstm.setInt(++i, pc.getPkCountForElf());
pstm.setInt(++i, pc.getExpRes());
pstm.setInt(++i, pc.getPartnerId());
pstm.setShort(++i, pc.getAccessLevel());
pstm.setInt(++i, pc.getOnlineStatus());
pstm.setInt(++i, pc.getHomeTownId());
pstm.setInt(++i, pc.getContribution());
pstm.setInt(++i, pc.getHellTime());
pstm.setBoolean(++i, pc.isBanned());
pstm.setInt(++i, pc.getKarma());
pstm.setTimestamp(++i, pc.getLastPk());
pstm.setTimestamp(++i, pc.getLastPkForElf());
pstm.setTimestamp(++i, pc.getDeleteTime());
pstm.setInt(++i, pc.getId());
pstm.execute();
_log.finest("stored char data:" + pc.getName());
} catch (SQLException e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
} finally {
SQLUtil.close(pstm);
SQLUtil.close(con);
}
}
}