package client.inventory; import constants.GameConstants; import database.DatabaseConnection; import java.awt.Point; import java.io.Serializable; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Iterator; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import server.MapleItemInformationProvider; import server.MapleStatEffect; import server.movement.AbsoluteLifeMovement; import server.movement.LifeMovement; import server.movement.LifeMovementFragment; public class MaplePet implements Serializable { private static final long serialVersionUID = 9179541993413738569L; private String name; private int Fh = 0; private int stance = 0; private int uniqueid; private int petitemid; private int secondsLeft = 0; private Point pos; private byte fullness = 100; private byte level = 30; private byte summoned = 0; private short inventorypos = 0; private short closeness = 30000; private short flags = 0; private boolean changed = false; private MaplePet(int petitemid, int uniqueid) { this.petitemid = petitemid; this.uniqueid = uniqueid; } private MaplePet(int petitemid, int uniqueid, short inventorypos) { this.petitemid = petitemid; this.uniqueid = uniqueid; this.inventorypos = inventorypos; } public static final MaplePet loadFromDb(int itemid, int petid, short inventorypos) { try { MaplePet ret = new MaplePet(itemid, petid, inventorypos); Connection con = DatabaseConnection.getConnection(); PreparedStatement ps = con.prepareStatement("SELECT * FROM pets WHERE petid = ?"); ps.setInt(1, petid); ResultSet rs = ps.executeQuery(); if (!rs.next()) { rs.close(); ps.close(); return null; } ret.setName(rs.getString("name")); ret.setCloseness(rs.getShort("closeness")); ret.setLevel(rs.getByte("level")); ret.setFullness(rs.getByte("fullness")); ret.setSecondsLeft(rs.getInt("seconds")); ret.setFlags(rs.getShort("flags")); ret.changed = false; rs.close(); ps.close(); return ret; } catch (SQLException ex) { Logger.getLogger(MaplePet.class.getName()).log(Level.SEVERE, null, ex); } return null; } public final void saveToDb() { if (!this.changed) { return; } try { PreparedStatement ps = DatabaseConnection.getConnection().prepareStatement("UPDATE pets SET name = ?, level = ?, closeness = ?, fullness = ?, seconds = ?, flags = ? WHERE petid = ?"); ps.setString(1, this.name); ps.setByte(2, this.level); ps.setShort(3, this.closeness); ps.setByte(4, this.fullness); ps.setInt(5, this.secondsLeft); ps.setShort(6, this.flags); ps.setInt(7, this.uniqueid); ps.executeUpdate(); ps.close(); this.changed = false; } catch (SQLException ex) { ex.printStackTrace(); } } public static final MaplePet createPet(int itemid, int uniqueid) { return createPet(itemid, MapleItemInformationProvider.getInstance().getName(itemid), 1, 0, 100, uniqueid, itemid == 5000054 ? 18000 : 0, (short) ((itemid == 5000067) && (!GameConstants.GMS) ? 55 : 0)); } public static final MaplePet createPet(int itemid, String name, int level, int closeness, int fullness, int uniqueid, int secondsLeft, short flag) { if (uniqueid <= -1) { uniqueid = MapleInventoryIdentifier.getInstance(); } try { PreparedStatement pse = DatabaseConnection.getConnection().prepareStatement("INSERT INTO pets (petid, name, level, closeness, fullness, seconds, flags) VALUES (?, ?, ?, ?, ?, ?, ?)"); pse.setInt(1, uniqueid); pse.setString(2, name); pse.setByte(3, (byte) level); pse.setShort(4, (short) closeness); pse.setByte(5, (byte) fullness); pse.setInt(6, secondsLeft); pse.setShort(7, flag); pse.executeUpdate(); pse.close(); } catch (SQLException ex) { ex.printStackTrace(); return null; } MaplePet pet = new MaplePet(itemid, uniqueid); pet.setName(name); pet.setLevel(level); pet.setFullness(fullness); pet.setCloseness(closeness); pet.setFlags(flag); pet.setSecondsLeft(secondsLeft); return pet; } public final String getName() { return this.name; } public final void setName(String name) { this.name = name; this.changed = true; } public final boolean getSummoned() { return this.summoned > 0; } public final byte getSummonedValue() { return this.summoned; } public final void setSummoned(int summoned) { this.summoned = ((byte) summoned); } public final short getInventoryPosition() { return this.inventorypos; } public final void setInventoryPosition(short inventorypos) { this.inventorypos = inventorypos; } public int getUniqueId() { return this.uniqueid; } public final short getCloseness() { return this.closeness; } public final void setCloseness(int closeness) { this.closeness = ((short) closeness); this.changed = true; } public final byte getLevel() { return this.level; } public final void setLevel(int level) { this.level = ((byte) level); this.changed = true; } public final byte getFullness() { return this.fullness; } public final void setFullness(int fullness) { this.fullness = ((byte) fullness); this.changed = true; } public final short getFlags() { return this.flags; } public final void setFlags(int fffh) { this.flags = ((short) fffh); this.changed = true; } public final int getFh() { return this.Fh; } public final void setFh(int Fh) { this.Fh = Fh; } public final Point getPos() { return this.pos; } public final void setPos(Point pos) { this.pos = pos; } public final int getStance() { return this.stance; } public final void setStance(int stance) { this.stance = stance; } public final int getPetItemId() { return this.petitemid; } public final boolean canConsume(int itemId) { MapleItemInformationProvider mii = MapleItemInformationProvider.getInstance(); for (Iterator i$ = mii.getItemEffect(itemId).getPetsCanConsume().iterator(); i$.hasNext();) { int petId = ((Integer) i$.next()).intValue(); if (petId == this.petitemid) { return true; } } return false; } public final void updatePosition(List<LifeMovementFragment> movement) { for (LifeMovementFragment move : movement) { if ((move instanceof LifeMovement)) { if ((move instanceof AbsoluteLifeMovement)) { setPos(((LifeMovement) move).getPosition()); } setStance(((LifeMovement) move).getNewstate()); } } } public final int getSecondsLeft() { return this.secondsLeft; } public final void setSecondsLeft(int sl) { this.secondsLeft = sl; this.changed = true; } public static enum PetFlag { ITEM_PICKUP(1, 5190000, 5191000), EXPAND_PICKUP(2, 5190002, 5191002), AUTO_PICKUP(4, 5190003, 5191003), UNPICKABLE(8, 5190005, -1), LEFTOVER_PICKUP(16, 5190004, 5191004), HP_CHARGE(32, 5190001, 5191001), MP_CHARGE(64, 5190006, -1), PET_BUFF(128, -1, -1), PET_DRAW(256, 5190007, -1), PET_DIALOGUE(512, 5190008, -1); private final int i; private final int item; private final int remove; private PetFlag(int i, int item, int remove) { this.i = i; this.item = item; this.remove = remove; } public final int getValue() { return this.i; } public final boolean check(int flag) { return (flag & this.i) == this.i; } public static final PetFlag getByAddId(int itemId) { for (PetFlag flag : values()) { if (flag.item == itemId) { return flag; } } return null; } public static final PetFlag getByDelId(int itemId) { for (PetFlag flag : values()) { if (flag.remove == itemId) { return flag; } } return null; } } }