package server.life;
import client.MapleCharacter;
import client.MapleClient;
import client.inventory.Item;
import client.inventory.MapleInventoryType;
import client.inventory.MaplePet;
import database.DatabaseConnection;
import handling.channel.ChannelServer;
import handling.world.WorldFindService;
import java.awt.Point;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import server.maps.MapleMap;
import tools.packet.NPCPacket;
public final class PlayerNPC extends MapleNPC {
private Map<Byte, Integer> equips = new HashMap();
private int mapid;
private int face;
private int hair;
private int charId;
private byte skin;
private byte gender;
private int[] pets = new int[3];
public PlayerNPC(ResultSet rs) throws Exception {
super(rs.getInt("ScriptId"), rs.getString("name"));
this.hair = rs.getInt("hair");
this.face = rs.getInt("face");
this.mapid = rs.getInt("map");
this.skin = rs.getByte("skin");
this.charId = rs.getInt("charid");
this.gender = rs.getByte("gender");
setCoords(rs.getInt("x"), rs.getInt("y"), rs.getInt("dir"), rs.getInt("Foothold"));
String[] pet = rs.getString("pets").split(",");
for (int i = 0; i < 3; i++) {
if (pet[i] != null) {
this.pets[i] = Integer.parseInt(pet[i]);
} else {
this.pets[i] = 0;
}
}
Connection con = DatabaseConnection.getConnection();
try (PreparedStatement ps = con.prepareStatement("SELECT * FROM playernpcs_equip WHERE NpcId = ?")) {
ps.setInt(1, getId());
ResultSet rs2 = ps.executeQuery();
while (rs2.next()) {
this.equips.put(rs2.getByte("equippos"), rs2.getInt("equipid"));
}
rs2.close();
ps.close();
}
}
public PlayerNPC(MapleCharacter cid, int npc, MapleMap map, MapleCharacter base) {
super(npc, cid.getName());
this.charId = cid.getId();
this.mapid = map.getId();
setCoords(base.getTruePosition().x, base.getTruePosition().y, 0, base.getFH());
update(cid);
}
public void setCoords(int x, int y, int f, int fh) {
setPosition(new Point(x, y));
setCy(y);
setRx0(x - 50);
setRx1(x + 50);
setF(f);
setFh(fh);
}
public static void loadAll() {
List<PlayerNPC> toAdd = new ArrayList();
Connection con = DatabaseConnection.getConnection();
try {
try (PreparedStatement ps = con.prepareStatement("SELECT * FROM playernpcs")) {
ResultSet rs = ps.executeQuery();
while (rs.next()) {
toAdd.add(new PlayerNPC(rs));
}
rs.close();
ps.close();
}
} catch (Exception se) {
se.printStackTrace();
}
for (PlayerNPC npc : toAdd) {
npc.addToServer();
}
}
public static void updateByCharId(MapleCharacter chr) {
if (WorldFindService.getInstance().findChannel(chr.getId()) > 0) {
for (PlayerNPC npc : ChannelServer.getInstance(WorldFindService.getInstance().findChannel(chr.getId())).getAllPlayerNPC()) {
npc.update(chr);
}
}
}
public void addToServer() {
for (ChannelServer cserv : ChannelServer.getAllInstances()) {
cserv.addPlayerNPC(this);
}
}
public void removeFromServer() {
for (ChannelServer cserv : ChannelServer.getAllInstances()) {
cserv.removePlayerNPC(this);
}
}
public void update(MapleCharacter chr) {
if ((chr == null) || (this.charId != chr.getId())) {
return;
}
setName(chr.getName());
setHair(chr.getHair());
setFace(chr.getFace());
setSkin(chr.getSkinColor());
setGender(chr.getGender());
this.equips = new HashMap();
for (Item item : chr.getInventory(MapleInventoryType.EQUIPPED).newList()) {
if (item.getPosition() < -127) {
continue;
}
this.equips.put((byte) item.getPosition(), item.getItemId());
}
saveToDB();
}
public void destroy() {
destroy(false);
}
public void destroy(boolean remove) {
Connection con = DatabaseConnection.getConnection();
try {
PreparedStatement ps = con.prepareStatement("DELETE FROM playernpcs WHERE scriptid = ?");
ps.setInt(1, getId());
ps.executeUpdate();
ps.close();
ps = con.prepareStatement("DELETE FROM playernpcs_equip WHERE npcid = ?");
ps.setInt(1, getId());
ps.executeUpdate();
ps.close();
if (remove) {
removeFromServer();
}
} catch (Exception se) {
se.printStackTrace();
}
}
public void saveToDB() {
Connection con = DatabaseConnection.getConnection();
try {
if (getNPCFromWZ() == null) {
destroy(true);
return;
}
destroy();
PreparedStatement ps = con.prepareStatement("INSERT INTO playernpcs(name, hair, face, skin, x, y, map, charid, scriptid, foothold, dir, gender, pets) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
ps.setString(1, getName());
ps.setInt(2, getHair());
ps.setInt(3, getFace());
ps.setInt(4, getSkin());
ps.setInt(5, getTruePosition().x);
ps.setInt(6, getTruePosition().y);
ps.setInt(7, getMapId());
ps.setInt(8, getCharId());
ps.setInt(9, getId());
ps.setInt(10, getFh());
ps.setInt(11, getF());
ps.setInt(12, getGender());
String[] pet = {"0", "0", "0"};
for (int i = 0; i < 3; i++) {
if (this.pets[i] > 0) {
pet[i] = String.valueOf(this.pets[i]);
}
}
ps.setString(13, pet[0] + "," + pet[1] + "," + pet[2]);
ps.executeUpdate();
ps.close();
ps = con.prepareStatement("INSERT INTO playernpcs_equip(npcid, charid, equipid, equippos) VALUES (?, ?, ?, ?)");
ps.setInt(1, getId());
ps.setInt(2, getCharId());
for (Map.Entry equip : this.equips.entrySet()) {
ps.setInt(3, ((Integer) equip.getValue()));
ps.setInt(4, ((Byte) equip.getKey()));
ps.executeUpdate();
}
ps.close();
} catch (Exception se) {
se.printStackTrace();
}
}
public Map<Byte, Integer> getEquips() {
return this.equips;
}
public byte getSkin() {
return this.skin;
}
public int getGender() {
return this.gender;
}
public int getFace() {
return this.face;
}
public int getHair() {
return this.hair;
}
public int getCharId() {
return this.charId;
}
public int getMapId() {
return this.mapid;
}
public void setSkin(byte s) {
this.skin = s;
}
public void setFace(int f) {
this.face = f;
}
public void setHair(int h) {
this.hair = h;
}
public void setGender(int g) {
this.gender = (byte) g;
}
public int getPet(int i) {
return this.pets[i] > 0 ? this.pets[i] : 0;
}
public void setPets(List<MaplePet> p) {
for (int i = 0; i < 3; i++) {
if ((p != null) && (p.size() > i) && (p.get(i) != null)) {
this.pets[i] = ((MaplePet) p.get(i)).getPetItemId();
} else {
this.pets[i] = 0;
}
}
}
@Override
public void sendSpawnData(MapleClient client) {
client.getSession().write(NPCPacket.spawnNPC(this, true));
client.getSession().write(NPCPacket.spawnPlayerNPC(this));
client.getSession().write(NPCPacket.spawnNPCRequestController(this, true));
}
public MapleNPC getNPCFromWZ() {
MapleNPC npc = MapleLifeFactory.getNPC(getId());
if (npc != null) {
npc.setName(getName());
}
return npc;
}
}