package client.inventory;
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.ArrayList;
import java.util.List;
import server.MapleItemInformationProvider;
import server.Randomizer;
import server.StructAndroid;
import server.movement.LifeMovement;
import server.movement.LifeMovementFragment;
import server.movement.StaticLifeMovement;
public class MapleAndroid
implements Serializable {
private static final long serialVersionUID = 9179541993413738569L;
private int stance = 0;
private final int uniqueid;
private final int itemid;
private int skin;
private int hair;
private int face;
private int gender;
private int type;
private String name;
private Point pos = new Point(0, 0);
private boolean changed = false;
private MapleAndroid(int itemid, int uniqueid) {
this.itemid = itemid;
this.uniqueid = uniqueid;
}
public static final MapleAndroid loadFromDb(int itemid, int uid) {
try {
MapleAndroid ret = new MapleAndroid(itemid, uid);
Connection con = DatabaseConnection.getConnection();
try (PreparedStatement ps = con.prepareStatement("SELECT * FROM androids WHERE uniqueid = ?")) {
ps.setInt(1, uid);
try (ResultSet rs = ps.executeQuery()) {
if (!rs.next()) {
rs.close();
ps.close();
return null;
}
int type = rs.getInt("type");
int gender = rs.getInt("gender");
boolean fix = false;
if (type < 1) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
type = ii.getAndroidType(itemid);
StructAndroid aInfo = ii.getAndroidInfo(type);
if (aInfo == null) {
return null;
}
gender = aInfo.gender;
fix = true;
}
ret.setType(type);
ret.setGender(gender);
ret.setSkin(rs.getInt("skin"));
ret.setHair(rs.getInt("hair"));
ret.setFace(rs.getInt("face"));
ret.setName(rs.getString("name"));
ret.changed = false;
}
}
return ret;
} catch (SQLException ex) {
System.err.println("加載機器人出錯:" + ex);
}
return null;
}
public final void saveToDb() {
if (!this.changed) {
return;
}
try {
try (PreparedStatement ps = DatabaseConnection.getConnection().prepareStatement("UPDATE androids SET type = ?, gender = ?, skin = ?, hair = ?, face = ?, name = ? WHERE uniqueid = ?")) {
ps.setInt(1, this.type);
ps.setInt(2, this.gender);
ps.setInt(3, this.skin);
ps.setInt(4, this.hair);
ps.setInt(5, this.face);
ps.setString(6, this.name);
ps.setInt(7, this.uniqueid);
ps.executeUpdate();
ps.close();
}
this.changed = false;
} catch (SQLException ex) {
System.err.println("保存機器人出錯:" + ex);
}
}
public static final MapleAndroid create(int itemid, int uniqueid) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
StructAndroid aInfo = ii.getAndroidInfo(ii.getAndroidType(itemid));
if (aInfo == null) {
return null;
}
return create(itemid, uniqueid, aInfo);
}
public static final MapleAndroid create(int itemid, int uniqueid, StructAndroid aInfo) {
if (uniqueid <= -1) {
uniqueid = MapleInventoryIdentifier.getInstance();
}
int type = aInfo.type;
int gender = aInfo.gender;
int skin = (aInfo.skin.get(Randomizer.nextInt(aInfo.skin.size())));
int hair = (aInfo.hair.get(Randomizer.nextInt(aInfo.hair.size())));
int face = (aInfo.face.get(Randomizer.nextInt(aInfo.face.size())));
try {
try (PreparedStatement pse = DatabaseConnection.getConnection().prepareStatement("INSERT INTO androids (uniqueid, type, gender, skin, hair, face, name) VALUES (?, ?, ?, ?, ?, ?, ?)")) {
pse.setInt(1, uniqueid);
pse.setInt(2, type);
pse.setInt(3, gender);
pse.setInt(4, skin);
pse.setInt(5, hair);
pse.setInt(6, face);
pse.setString(7, "機器人");
pse.executeUpdate();
}
} catch (SQLException ex) {
return null;
}
MapleAndroid android = new MapleAndroid(itemid, uniqueid);
android.setType(type);
android.setGender(gender);
android.setSkin(skin);
android.setHair(hair);
android.setFace(face);
android.setName("機器人");
return android;
}
//
public void delete() {
}
public int getUniqueId() {
return this.uniqueid;
}
public int getType() {
return this.type;
}
public void setType(int t) {
this.type = t;
this.changed = true;
}
public int getGender() {
return this.gender;
}
public void setGender(int g) {
this.gender = g;
this.changed = true;
}
public int getSkin() {
return this.skin;
}
public void setSkin(int s) {
this.skin = s;
this.changed = true;
}
public final void setHair(int closeness) {
this.hair = closeness;
this.changed = true;
}
public final int getHair() {
return this.hair;
}
public final void setFace(int closeness) {
this.face = closeness;
this.changed = true;
}
public final int getFace() {
return this.face;
}
public String getName() {
return this.name;
}
public void setName(String n) {
this.name = n;
this.changed = true;
}
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 getItemId() {
return this.itemid;
}
public final void updatePosition(List<LifeMovementFragment> movement) {
for (LifeMovementFragment move : movement) {
if ((move instanceof LifeMovement)) {
if ((move instanceof StaticLifeMovement)) {
setPos(((LifeMovement) move).getPosition());
}
setStance(((LifeMovement) move).getNewstate());
}
}
}
public static void clearAndroid() {
try {
Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM androids");
ResultSet rs = ps.executeQuery();
ArrayList<Integer> uids = new ArrayList();
while (rs.next()) {
int uid = rs.getInt("uniqueid");
if (!ItemLoader.isExistsByUniqueid(uid)) {
System.err.println("機器人:" + rs.getString("name") + " uniqueid: " + uid + " 不存在, 清理。");
uids.add(uid);
}
}
ps.close();
rs.close();
for (int id : uids) {
ps = con.prepareStatement("DELETE FROM androids WHERE uniqueid = ?");
ps.setInt(1, id);
ps.executeUpdate();
}
} catch (SQLException se) {
System.err.println("[MapleAndroid] 從數據庫中加載機器人訊息出錯");
}
}
}