package net.scapeemulator.game.io.jdbc;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import net.scapeemulator.game.model.player.Player;
import net.scapeemulator.game.model.player.appearance.Appearance;
import net.scapeemulator.game.model.player.appearance.Appearance.Feature;
import net.scapeemulator.game.model.player.appearance.Gender;
public final class AppearanceTable extends Table<Player> {
private final PreparedStatement loadStatement;
private final PreparedStatement saveStatement;
public AppearanceTable(Connection connection) throws SQLException {
this.loadStatement = connection.prepareStatement("SELECT * FROM appearance WHERE player_id = ?;");
this.saveStatement = connection.prepareStatement("INSERT INTO appearance (player_id, type, value) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE value = VALUES(value);");
}
@Override
public void load(Player player) throws SQLException, IOException {
loadStatement.setInt(1, player.getDatabaseId());
Appearance appearance = new Appearance(player);
try (ResultSet set = loadStatement.executeQuery()) {
while (set.next()) {
String type = set.getString("type");
int value = set.getInt("value");
switch (type) {
case "gender":
appearance.setGender(value == 0 ? Gender.MALE : Gender.FEMALE);
appearance.reset();
break;
case "hair_style":
appearance.setStyleIndex(Feature.HAIR, value);
break;
case "hair_color":
appearance.setColorIndex(Feature.HAIR, value);
break;
case "facial_hair_style":
appearance.setStyleIndex(Feature.FACIAL_HAIR, value);
break;
case "torso_style":
appearance.setStyleIndex(Feature.TORSO, value);
break;
case "torso_color":
appearance.setColorIndex(Feature.TORSO, value);
break;
case "arm_style":
appearance.setStyleIndex(Feature.ARMS, value);
break;
case "wrist_style":
appearance.setStyleIndex(Feature.WRISTS, value);
break;
case "leg_style":
appearance.setStyleIndex(Feature.LEGS, value);
break;
case "leg_color":
appearance.setColorIndex(Feature.LEGS, value);
break;
case "feet_style":
appearance.setStyleIndex(Feature.FEET, value);
break;
case "feet_color":
appearance.setColorIndex(Feature.FEET, value);
break;
case "skin_color":
appearance.setColorIndex(Feature.SKIN, value);
break;
default:
throw new IOException("unknown appearance type: " + type);
}
}
}
player.setAppearance(appearance);
}
@Override
public void save(Player player) throws SQLException, IOException {
saveStatement.setInt(1, player.getDatabaseId());
Appearance appearance = player.getAppearance();
saveStatement.setString(2, "gender");
saveStatement.setInt(3, appearance.getGender().ordinal());
saveStatement.addBatch();
saveStatement.setString(2, "hair_style");
saveStatement.setInt(3, appearance.getStyleIndex(Feature.HAIR));
saveStatement.addBatch();
saveStatement.setString(2, "hair_color");
saveStatement.setInt(3, appearance.getColorIndex(Feature.HAIR));
saveStatement.addBatch();
saveStatement.setString(2, "facial_hair_style");
saveStatement.setInt(3, appearance.getStyleIndex(Feature.FACIAL_HAIR));
saveStatement.addBatch();
saveStatement.setString(2, "torso_style");
saveStatement.setInt(3, appearance.getStyleIndex(Feature.TORSO));
saveStatement.addBatch();
saveStatement.setString(2, "torso_color");
saveStatement.setInt(3, appearance.getColorIndex(Feature.TORSO));
saveStatement.addBatch();
saveStatement.setString(2, "arm_style");
saveStatement.setInt(3, appearance.getStyleIndex(Feature.ARMS));
saveStatement.addBatch();
saveStatement.setString(2, "wrist_style");
saveStatement.setInt(3, appearance.getStyleIndex(Feature.WRISTS));
saveStatement.addBatch();
saveStatement.setString(2, "leg_style");
saveStatement.setInt(3, appearance.getStyleIndex(Feature.LEGS));
saveStatement.addBatch();
saveStatement.setString(2, "leg_color");
saveStatement.setInt(3, appearance.getColorIndex(Feature.LEGS));
saveStatement.addBatch();
saveStatement.setString(2, "feet_style");
saveStatement.setInt(3, appearance.getStyleIndex(Feature.FEET));
saveStatement.addBatch();
saveStatement.setString(2, "feet_color");
saveStatement.setInt(3, appearance.getColorIndex(Feature.FEET));
saveStatement.addBatch();
saveStatement.setString(2, "skin_color");
saveStatement.setInt(3, appearance.getColorIndex(Feature.SKIN));
saveStatement.addBatch();
saveStatement.executeBatch();
}
}