package handling.world.sidekick;
import client.MapleBuffStat;
import client.MapleCharacter;
import database.DatabaseConnection;
import handling.world.WorldBroadcastService;
import handling.world.WorldSidekickService;
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.MapleStatEffect;
import tools.Pair;
import tools.packet.BuffPacket;
import tools.packet.PartyPacket;
public class MapleSidekick
implements Serializable {
private static final long serialVersionUID = 954199343336738569L;
private MapleSidekickCharacter[] sidekicks = new MapleSidekickCharacter[2];
private int id;
public MapleSidekick(int sid) {
this.id = sid;
try {
Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM sidekicks WHERE id = ?");
ps.setInt(1, sid);
ResultSet rs = ps.executeQuery();
if (!rs.first()) {
rs.close();
ps.close();
this.id = -1;
return;
}
try (PreparedStatement ps2 = con.prepareStatement("SELECT id, name, level, job, mapid FROM characters WHERE id = ? OR id = ?")) {
ps.setInt(1, rs.getInt("firstid"));
ps.setInt(2, rs.getInt("secondid"));
try (ResultSet rs2 = ps.executeQuery()) {
while (rs2.next()) {
this.sidekicks[(rs2.getInt("id") == rs.getInt("firstid") ? 0 : 1)] = new MapleSidekickCharacter(rs2.getInt("id"), rs2.getString("name"), rs2.getInt("level"), rs2.getInt("job"), rs2.getInt("mapid"));
}
}
ps.close();
}
if ((this.sidekicks[0] == null) || (this.sidekicks[1] == null) || (!checkLevels(this.sidekicks[0].getLevel(), this.sidekicks[1].getLevel()))) {
this.id = -1;
eraseToDB();
}
} catch (SQLException se) {
System.err.println("unable to read sidekick information from sql" + se);
}
}
public void broadcast(byte[] packet) {
WorldBroadcastService.getInstance().sendPacket(this.sidekicks[0].getId(), packet);
WorldBroadcastService.getInstance().sendPacket(this.sidekicks[1].getId(), packet);
}
public final void eraseToDB() {
try {
Connection con = DatabaseConnection.getConnection();
try (PreparedStatement ps = con.prepareStatement("DELETE FROM sidekicks WHERE id = ?")) {
ps.setInt(1, this.id);
ps.executeUpdate();
ps.close();
}
broadcast(PartyPacket.disbandSidekick(this));
WorldSidekickService.getInstance().eraseSidekick(this.id);
} catch (SQLException se) {
System.err.println("Error deleting sidekick" + se);
}
}
public void applyBuff(MapleCharacter chr) {
List effects = new ArrayList();
int levelD = Math.abs(getCharacter(0).getLevel() - getCharacter(1).getLevel());
chr.getClient().getSession().write(BuffPacket.giveBuff(79797980, 2100000000, effects));
MapleStatEffect eff = MapleItemInformationProvider.getInstance().getItemEffect(2022891);
chr.registerEffect(eff, System.currentTimeMillis(), null, effects, false, 2100000000, chr.getId());
}
public static int create(int leaderId, int leaderId2) {
try {
Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT id FROM sidekicks WHERE firstid = ? OR secondid = ? OR firstid = ? OR secondid = ?");
ps.setInt(1, leaderId);
ps.setInt(2, leaderId2);
ps.setInt(3, leaderId);
ps.setInt(4, leaderId2);
ResultSet rs = ps.executeQuery();
if (rs.first()) {
rs.close();
ps.close();
return 0;
}
ps.close();
rs.close();
ps = con.prepareStatement("INSERT INTO sidekicks (firstid, secondid) VALUES (?, ?)", 1);
ps.setInt(1, leaderId);
ps.setInt(2, leaderId2);
ps.executeUpdate();
rs = ps.getGeneratedKeys();
int ret = 0;
if (rs.next()) {
ret = rs.getInt(1);
}
rs.close();
ps.close();
return ret;
} catch (SQLException se) {
System.err.println("Error create sidekick" + se);
}
return 0;
}
public static List<MapleSidekick> loadAll() {
List ret = new ArrayList();
try {
Connection con = DatabaseConnection.getConnection();
try (PreparedStatement ps = con.prepareStatement("SELECT id FROM sidekicks"); ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
ret.add(new MapleSidekick(rs.getInt("id")));
}
ps.close();
}
} catch (SQLException se) {
System.err.println("unable to read sidekick information from sql" + se);
}
return ret;
}
public List<String> getSidekickMsg(boolean online) {
List ret = new ArrayList();
if (!online) {
ret.add("You may only get benefits from the sidekick if they are in the same map.");
}
if ((getCharacter(0).getLevel() > 140) || (getCharacter(1).getLevel() > 140)) {
ret.add("The sidekick relationship will end if one player gets above level 150.");
}
if ((Math.abs(getCharacter(0).getLevel() - getCharacter(1).getLevel()) < 5) || (Math.abs(getCharacter(0).getLevel() - getCharacter(1).getLevel()) > 30)) {
ret.add("The sidekick relationship will end if the level difference is less than 5 or greater than 30.");
}
return ret;
}
public static boolean checkLevels(int level1, int level2) {
return (Math.abs(level1 - level2) >= 5) && (Math.abs(level1 - level2) <= 30) && (level1 <= 150) && (level2 <= 150) && (level1 >= 10) && (level2 >= 10);
}
public int getId() {
return this.id;
}
public MapleSidekickCharacter getCharacter(int index) {
return this.sidekicks[index];
}
@Override
public int hashCode() {
int prime = 31;
int result = 1;
result = prime * result + this.id;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
MapleSidekick other = (MapleSidekick) obj;
return this.id == other.id;
}
}