📄 maplecharacter.java
字号:
ret.keymap.put(Integer.valueOf(2), new MapleKeyBinding(4, 10));
ret.keymap.put(Integer.valueOf(23), new MapleKeyBinding(4, 1));
ret.keymap.put(Integer.valueOf(3), new MapleKeyBinding(4, 12));
ret.keymap.put(Integer.valueOf(4), new MapleKeyBinding(4, 13));
ret.keymap.put(Integer.valueOf(5), new MapleKeyBinding(4, 18));
ret.keymap.put(Integer.valueOf(6), new MapleKeyBinding(4, 21));
ret.keymap.put(Integer.valueOf(16), new MapleKeyBinding(4, 8));
ret.keymap.put(Integer.valueOf(17), new MapleKeyBinding(4, 5));
ret.keymap.put(Integer.valueOf(19), new MapleKeyBinding(4, 4));
ret.keymap.put(Integer.valueOf(25), new MapleKeyBinding(4, 19));
ret.keymap.put(Integer.valueOf(26), new MapleKeyBinding(4, 14));
ret.keymap.put(Integer.valueOf(27), new MapleKeyBinding(4, 15));
ret.keymap.put(Integer.valueOf(29), new MapleKeyBinding(5, 52));
ret.keymap.put(Integer.valueOf(31), new MapleKeyBinding(4, 2));
ret.keymap.put(Integer.valueOf(34), new MapleKeyBinding(4, 17));
ret.keymap.put(Integer.valueOf(35), new MapleKeyBinding(4, 11));
ret.keymap.put(Integer.valueOf(37), new MapleKeyBinding(4, 3));
ret.keymap.put(Integer.valueOf(38), new MapleKeyBinding(4, 20));
ret.keymap.put(Integer.valueOf(40), new MapleKeyBinding(4, 16));
ret.keymap.put(Integer.valueOf(43), new MapleKeyBinding(4, 9));
ret.keymap.put(Integer.valueOf(44), new MapleKeyBinding(5, 50));
ret.keymap.put(Integer.valueOf(45), new MapleKeyBinding(5, 51));
ret.keymap.put(Integer.valueOf(46), new MapleKeyBinding(4, 6));
ret.keymap.put(Integer.valueOf(50), new MapleKeyBinding(4, 7));
ret.keymap.put(Integer.valueOf(56), new MapleKeyBinding(5, 53));
ret.keymap.put(Integer.valueOf(59), new MapleKeyBinding(6, 100));
ret.keymap.put(Integer.valueOf(60), new MapleKeyBinding(6, 101));
ret.keymap.put(Integer.valueOf(61), new MapleKeyBinding(6, 102));
ret.keymap.put(Integer.valueOf(62), new MapleKeyBinding(6, 103));
ret.keymap.put(Integer.valueOf(63), new MapleKeyBinding(6, 104));
ret.keymap.put(Integer.valueOf(64), new MapleKeyBinding(6, 105));
ret.recalcLocalStats();
return ret;
}
public void saveToDB(boolean update) {
Connection con = DatabaseConnection.getConnection();
try {
// clients should not be able to log back before their old state is saved (see MapleClient#getLoginState) so we are save to switch to a very low isolation level here
con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
// connections are thread local now, no need to
// synchronize anymore =)
con.setAutoCommit(false);
PreparedStatement ps;
if (update) {
ps = con.prepareStatement("UPDATE characters "
+ "SET level = ?, fame = ?, str = ?, dex = ?, luk = ?, `int` = ?, "
+ "exp = ?, hp = ?, mp = ?, maxhp = ?, maxmp = ?, sp = ?, ap = ?, "
+ "gm = ?, skincolor = ?, gender = ?, job = ?, hair = ?, face = ?, map = ?, "
+ "meso = ?, hpApUsed = ?, mpApUsed = ?, spawnpoint = ?, party = ?, buddyCapacity = ? WHERE id = ?");
} else {
ps = con
.prepareStatement("INSERT INTO characters ("
+ "level, fame, str, dex, luk, `int`, exp, hp, mp, "
+ "maxhp, maxmp, sp, ap, gm, skincolor, gender, job, hair, face, map, meso, hpApUsed, mpApUsed, spawnpoint, party, buddyCapacity, accountid, name, world"
+ ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
}
ps.setInt(1, level);
ps.setInt(2, fame);
ps.setInt(3, str);
ps.setInt(4, dex);
ps.setInt(5, luk);
ps.setInt(6, int_);
ps.setInt(7, exp.get());
ps.setInt(8, hp);
ps.setInt(9, mp);
ps.setInt(10, maxhp);
ps.setInt(11, maxmp);
ps.setInt(12, remainingSp);
ps.setInt(13, remainingAp);
ps.setInt(14, (gm ? 1 : 0));
ps.setInt(15, skinColor.getId());
ps.setInt(16, gender);
ps.setInt(17, job.getId());
ps.setInt(18, hair);
ps.setInt(19, face);
if (map == null) {
ps.setInt(20, 0);
} else {
ps.setInt(20, map.getId());
}
ps.setInt(21, meso.get());
ps.setInt(22, hpApUsed);
ps.setInt(23, mpApUsed);
if (map == null) {
ps.setInt(24, 0);
} else {
MaplePortal closest = map.findClosestSpawnpoint(getPosition());
if (closest != null) {
ps.setInt(24, closest.getId());
} else {
ps.setInt(24, 0);
}
}
if (party != null) {
ps.setInt(25, party.getId());
} else {
ps.setInt(25, -1);
}
ps.setInt(26, buddylist.getCapacity());
if (update) {
ps.setInt(27, id);
} else {
ps.setInt(27, accountid);
ps.setString(28, name);
ps.setInt(29, world); // TODO store world somewhere ;)
}
int updateRows = ps.executeUpdate();
if (!update) {
ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) {
this.id = rs.getInt(1);
} else {
throw new DatabaseException("Inserting char failed.");
}
} else if (updateRows < 1) {
throw new DatabaseException("Character not in database (" + id + ")");
}
ps.close();
ps = con.prepareStatement("DELETE FROM inventoryitems WHERE characterid = ?");
ps.setInt(1, id);
ps.executeUpdate();
ps.close();
ps = con.prepareStatement("INSERT INTO inventoryitems"
+ "(characterid, itemid, inventorytype, position, quantity, owner) " + "VALUES (?, ?, ?, ?, ?, ?)");
PreparedStatement pse = con.prepareStatement("INSERT INTO inventoryequipment "
+ "VALUES (DEFAULT, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
// PreparedStatement psl = con.prepareStatement("INSERT INTO inventorylog " +
// "VALUES (DEFAULT, ?, ?)");
for (MapleInventory iv : inventory) {
ps.setInt(3, iv.getType().getType());
for (IItem item : iv.list()) {
// ps.setInt(1, item.getId());
ps.setInt(1, id);
ps.setInt(2, item.getItemId());
ps.setInt(4, item.getPosition());
ps.setInt(5, item.getQuantity());
ps.setString(6, item.getOwner());
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
int itemid;
if (rs.next()) {
itemid = rs.getInt(1);
} else {
throw new DatabaseException("Inserting char failed.");
}
// for (String msg : item.getLog()) {
// psl.setInt(1, itemid);
// psl.setString(2, msg);
// psl.executeUpdate();
// }
if (iv.getType().equals(MapleInventoryType.EQUIP) ||
iv.getType().equals(MapleInventoryType.EQUIPPED)) {
pse.setInt(1, itemid);
IEquip equip = (IEquip) item;
pse.setInt(2, equip.getUpgradeSlots());
pse.setInt(3, equip.getLevel());
pse.setInt(4, equip.getStr());
pse.setInt(5, equip.getDex());
pse.setInt(6, equip.getInt());
pse.setInt(7, equip.getLuk());
pse.setInt(8, equip.getHp());
pse.setInt(9, equip.getMp());
pse.setInt(10, equip.getWatk());
pse.setInt(11, equip.getMatk());
pse.setInt(12, equip.getWdef());
pse.setInt(13, equip.getMdef());
pse.setInt(14, equip.getAcc());
pse.setInt(15, equip.getAvoid());
pse.setInt(16, equip.getHands());
pse.setInt(17, equip.getSpeed());
pse.setInt(18, equip.getJump());
pse.executeUpdate();
}
}
}
ps.close();
pse.close();
// psl.close();
deleteWhereCharacterId(con, "DELETE FROM queststatus WHERE characterid = ?");
ps = con.prepareStatement("INSERT INTO queststatus (`queststatusid`, `characterid`, `quest`, `status`, `time`, `forfeited`) " +
" VALUES (DEFAULT, ?, ?, ?, ?, ?)",
Statement.RETURN_GENERATED_KEYS);
pse = con.prepareStatement("INSERT INTO queststatusmobs VALUES (DEFAULT, ?, ?, ?)");
ps.setInt(1, id);
for (MapleQuestStatus q : quests.values()) {
ps.setInt(2, q.getQuest().getId());
ps.setInt(3, q.getStatus().getId());
ps.setInt(4, (int) (q.getCompletionTime() / 1000));
ps.setInt(5, q.getForfeited());
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
rs.next();
for (int mob : q.getMobKills().keySet()) {
pse.setInt(1, rs.getInt(1));
pse.setInt(2, mob);
pse.setInt(3, q.getMobKills(mob));
pse.executeUpdate();
}
rs.close();
}
ps.close();
pse.close();
deleteWhereCharacterId(con, "DELETE FROM skills WHERE characterid = ?");
ps = con.prepareStatement("INSERT INTO skills (characterid, skillid, skilllevel) VALUES (?, ?, ?)");
ps.setInt(1, id);
for (Entry<ISkill, SkillEntry> skill : skills.entrySet()) {
ps.setInt(2, skill.getKey().getId());
ps.setInt(3, skill.getValue().skillevel);
ps.executeUpdate();
}
ps.close();
deleteWhereCharacterId(con, "DELETE FROM keymap WHERE characterid = ?");
ps = con.prepareStatement("INSERT INTO keymap (characterid, `key`, `type`, `action`) VALUES (?, ?, ?, ?)");
ps.setInt(1, id);
for (Entry<Integer, MapleKeyBinding> keybinding : keymap.entrySet()) {
ps.setInt(2, keybinding.getKey().intValue());
ps.setInt(3, keybinding.getValue().getType());
ps.setInt(4, keybinding.getValue().getAction());
ps.executeUpdate();
}
ps.close();
deleteWhereCharacterId(con, "DELETE FROM savedlocations WHERE characterid = ?");
ps = con.prepareStatement("INSERT INTO savedlocations (characterid, `locationtype`, `map`) VALUES (?, ?, ?)");
ps.setInt(1, id);
for (SavedLocationType savedLocationType : SavedLocationType.values()) {
if (savedLocations[savedLocationType.ordinal()] != -1) {
ps.setString(2, savedLocationType.name());
ps.setInt(3, savedLocations[savedLocationType.ordinal()]);
ps.executeUpdate();
}
}
ps.close();
deleteWhereCharacterId(con, "DELETE FROM buddies WHERE characterid = ? AND pending = 0");
ps = con.prepareStatement("INSERT INTO buddies (characterid, `buddyid`, `pending`) VALUES (?, ?, 0)");
ps.setInt(1, id);
for (BuddylistEntry entry : buddylist.getBuddies()) {
if (entry.isVisible()) {
ps.setInt(2, entry.getCharacterId());
ps.executeUpdate();
}
}
ps.close();
if (storage != null) {
storage.saveToDB();
} else {
MapleStorage.create(client.getAccID());
}
con.commit();
} catch (Exception e) {
log.error(MapleClient.getLogMessage(this, "[charsave] Error saving character data"), e);
try {
con.rollback();
} catch (SQLException e1) {
log.error(MapleClient.getLogMessage(this, "[charsave] Error Rolling Back"), e);
}
} finally {
try {
con.setAutoCommit(true);
con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
} catch (SQLException e) {
log.error(MapleClient.getLogMessage(this, "[charsave] Error going back to autocommit mode"), e);
}
}
}
private void deleteWhereCharacterId(Connection con, String sql) throws SQLException {
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1, id);
ps.executeUpdate();
ps.close();
}
public MapleQuestStatus getQuest(MapleQuest quest) {
if (!quests.containsKey(quest))
return new MapleQuestStatus(quest, MapleQuestStatus.Status.NOT_STARTED);
return quests.get(quest);
}
public void updateQuest(MapleQuestStatus quest) {
quests.put(quest.getQuest(), quest);
if (!(quest.getQuest() instanceof MapleCustomQuest)) {
if (quest.getStatus().equals(MapleQuestStatus.Status.STARTED)) {
client.getSession().write(MaplePacketCreator.startQuest(this, (short) quest.getQuest().getId()));
client.getSession().write(MaplePacketCreator.updateQuestInfo(this, (short) quest.getQuest().getId(), quest.getNpc(), (byte) 6));
} else if (quest.getStatus().equals(MapleQuestStatus.Status.COMPLETED)) {
client.getSession().write(MaplePacketCreator.completeQuest(this, (short) quest.getQuest().getId()));
} else if (quest.getStatus().equals(MapleQuestStatus.Status.NOT_STARTED)) {
client.getSession().write(MaplePacketCreator.forfeitQuest(this, (short) quest.getQuest().getId()));
}
}
}
public static int getIdByName(String name, int world) {
Connection con = DatabaseConnection.getConnection();
PreparedStatement ps;
try {
ps = con.prepareStatement("SELECT id FROM characters WHERE name = ? AND world = ?");
ps.setString(1, name);
ps.setInt(2, world);
ResultSet rs = ps.executeQuery();
if (!rs.next()) {
ps.close();
return -1;
}
int id = rs.getInt("id");
ps.close();
return id;
} catch (SQLException e) {
log.error("ERROR", e);
}
return -1;
}
public Integer getBuffedValue(MapleBuffStat effect) {
MapleBuffStatValueHolder mbsvh = effects.get(effect);
if (mbsvh == null) {
return null;
}
return Integer.valueOf(mbsvh.value);
}
public boolean isBuffFrom (MapleBuffStat stat, ISkill skill) {
MapleBuffStatValueHolder mbsvh = effects.get(stat);
if (mbsvh == null) {
return false;
}
return mbsvh.effect.isSkill() && mbsvh.effect.getSourceId() == skill.getId();
}
public int getBuffSource (MapleBuffStat stat) {
MapleBuffStatValueHolder mbsvh = effects.get(stat);
if (mbsvh == null) {
return -1;
}
return mbsvh.effect.getSourceId();
}
public void setBuffedValue(MapleBuffStat effect, int value) {
MapleBuffStatValueHolder mbsvh = effects.get(effect);
if (mbsvh == null) {
return;
}
mbsvh.value = value;
}
public Long getBuffedStarttime(MapleBuffStat effect) {
MapleBuffStatValueHolder mbsvh = effects.get(effect);
if (mbsvh == null) {
return null;
}
return Long.valueOf(mbsvh.startTime);
}
public MapleStatEffect getStatForBuff(MapleBuffStat effect) {
MapleBuffStatValueHolder mbsvh = effects.get(effect);
if (mbsvh == null) {
return null;
}
return mbsvh.effect;
}
private void prepareDragonBlood(final MapleStatEffect bloodEffect) {
if (dragonBloodSchedule != null) {
dragonBloodSchedule.cancel(false);
}
dragonBloodSchedule = TimerManager.getInstance().register(new Runnable() {
@Override
public void run() {
addHP(-bloodEffect.getX());
getClient().getSession().write(MaplePacketCreator.showOwnBuffEffect(bloodEffect.getSourceId(), 5));
getMap().broadcastMessage(MapleCharacter.this, MaplePacketCreator.showBuffeffect(getId(), bloodEffect.getSourceId(), 5), false);
}
}, 4000, 4000);
}
public void registerEffect(MapleStatEffect effect, long starttime, ScheduledFuture<?> schedule) {
if (effect.isHide()) {
this.hidden = true;
getMap().broadcastMessage(this, MaplePacketCreator.removePlayerFromMap(getId()), false);
} else if (effect.isDragonBlood()) {
prepareDragonBlood(effect);
}
for (Pair<MapleBuffStat, Integer> statup : effect.getStatups()) {
effects.put(statup.getLeft(), new MapleBuffStatValueHolder(effect, starttime, schedule, statup.getRight().intValue()));
}
recalcLocalStats();
}
private List<MapleBuffStat> getBuffStats(MapleStatEffect effect, long startTime) {
List<MapleBuffStat> stats = new ArrayList<MapleBuffStat>();
for (Entry<MapleBuffStat, MapleBuffStatValueHolder> stateffect : effects.entrySet()) {
MapleBuffStatValueHolder mbsvh = stateffect.getValue();
if (mbsvh.effect.sameSource(effect) && (startTime == -1 || startTime == mbsvh.startTime)) {
stats.add(stateffect.getKey());
}
}
return stats;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -